Як перевірити компонент Joomla 2.5


12

Я поставив це питання на StackOverflow , і мені запропонували задати його тут.

Я знайомий з тестуванням модуля / системи / інтеграції і хотів би мати можливість протестувати свій компонент Joomla. Чи існує стандартний спосіб цього зробити?

Я працюю над цим прикладом компонента joomla mvc , який не включає тести. Все, що я можу знайти в документації Joomla та на різних веб-сайтах, - це фрагменти тестового коду та файли bootstrap.php. Конкретно, що я хотів би знати:

  • Куди поставити код тесту компонента
  • Чи потрібно мені надати свій власний bootstrap.php, чи є якийсь спосіб просто "включити joomla" та запустити мої тести

В ідеалі хтось міг би направити мене на відкритий джерело Joomla компонента, який має тести та інструкції, як їх запустити (був швидкий огляд, перші 5 або близько того не мали тестів).

Найближче, що я знайшов - це це , на чому я базувався на моєму манекені.

Що я робив до цих пір

Структура каталогу компонентів:

  • Привіт Світ/
    • адміністратор /
      • ...
      • тести /
        • bootstrap.php
        • phpunit.xml
        • модельHelloWorldsTest.php
    • сайт /
      • ...
    • helloworld.xml

Перша спроба

Для запуску тестів я встановлюю / копіюю компонент до моєї установки Joomla. Потім я запускаю таку команду з ~ joomla / адміністрування / компоненти / com_helloworld / тести:

php phpunit-4.2.phar --bootstrap bootstrap.php .

від якого я отримую

Fatal error: Class 'ContentController' not found in C:\inetpub\wwwroot\ws_cairnstest\administrator\components\com_helloworld\tests\modelsHelloWorldsTest.php on line 5

Я знаю, це означає, що мій bootstrap.php невірний і не завантажив необхідні класи Joomla. Я буду досліджувати це в якийсь момент, але це здається великою кількістю налаштувань просто для того, щоб запустити кілька тестів.

bootstrap.php:

<?php
error_reporting(E_ALL);

define('_JEXEC', 1);
define('BASEPATH',realpath(dirname(__FILE__).'/../../'));
define('JOOMLA_PATH',realpath(dirname(__FILE__).'/../../../../../'));
define('JOOMLA_ADMIN_PATH',realpath(dirname(__FILE__).'/../../../../'));
$_SERVER['HTTP_HOST'] = 'localhost';
$_SERVER['REQUEST_METHOD'] = 'GET';

if (file_exists(JOOMLA_ADMIN_PATH . '/defines.php'))
{
    include_once JOOMLA_ADMIN_PATH . '/defines.php';
}

if (!defined('_JDEFINES'))
{
    define('JPATH_BASE', JOOMLA_ADMIN_PATH);
    require_once JPATH_BASE . '/includes/defines.php';
}

require_once JPATH_BASE . '/includes/framework.php';
require_once JPATH_BASE . '/includes/helper.php';
require_once JPATH_BASE . '/includes/toolbar.php';
define('JPATH_COMPONENT',JOOMLA_ADMIN_PATH.'/components/com_content');
$app = JFactory::getApplication('administrator');
include BASEPATH.'/controller.php';

моделіHelloWorldsTest.php:

<?php
class HelloWorldsTest extends \PHPUnit_Framework_TestCase {

    public function testList(){
        $c = new ContentController();
        $model = $c->getModel('helloworlds');
        $worlds = $model->getItems();
        var_dump($worlds);
        $this->assertNotEmpty($worlds);
    }
}

phpunit.xml:

<phpunit bootstrap="bootstrap.php"
    colors="true"
    convertErrorsToExceptions="true"
    convertNoticesToExceptions="true"
    convertWarningsToExceptions="true"
    processIsolation="false"
    stopOnFailure="false"
    syntaxCheck="false"
    verbose="true">
</phpunit>

Друга спроба

Побачивши цю відповідь , я поставив свої тести під тест / блок під мою інсталяцію Joomla, скопіював phpunit.dist.xml і bootstrap.php з репортажу joomla-cms у відповідні місця та все-таки отримав

Fatal error: Class 'ContentController' not found in C:\inetpub\wwwroot\ws_cairnstest\administrator\components\com_helloworld\tests\modelsHelloWorldsTest.php on line 5

помилка, яку я отримував раніше.

Відповіді:


3

Куди поставити код тесту компонента

Як правило, найкраща практика говорить:

/src/
/tests/

Але я пропустив / src і просто, але / тестує / всередині каталогу компонентів. На передньому кінці для компонента "abc" це може виглядати приблизно так:

/components/com_abc/
/components/com_abc/abc.php
/components/com_abc/controller.php
/components/com_abc/router.php
/components/com_abc/tests/
/components/com_abc/tests/controllerTest.php

Чи потрібно мені надати власний bootstrap.php

Я зробив. Різновид. Я щойно скопіював ласощі в кореневий файл index.php у верхній частині мого сценарію тестування модуля. Ваш був поруч із моїм. Наступним моїм кроком буде інкапсуляція в окремий файл, який я потребую_once ().

<?php

error_reporting(E_ALL);

define('_JEXEC', 1);
define('_PHPUNIT', 1);
define('JPATH_BASE', "/var/www/html/abcsite");

require_once JPATH_BASE . '/includes/defines.php';
require_once JPATH_BASE . '/includes/framework.php';

// Instantiate the application.
$app = JFactory::getApplication('site');

// Include dependancies
require_once '../controller.php';

// This is specific to this component
define('JPATH_COMPONENT', JPATH_BASE . "/components/com_abc");

class controllerTest extends PHPUnit_Framework_TestCase
{
    public function testCronjob()
    {

        // Need access to the controller
        $controller = JController::getInstance('Abc');

        // Should return
        $this->assertEquals('test', $controller->execute("cronjob"));

    }
...

В ідеалі хтось міг би направити мене на відкритий джерело Joomla компонента, який має тести та інструкції, як їх запустити (був швидкий огляд, перші 5 або близько того не мали тестів).

Мені було досить просто прокатати своє. Я навіть не покладався налагодити phpunit.xml.


Нарешті я дістався, щоб спробувати це (не використовував Joomla вже давно!). Здається, зробити трюк!
uozuAho

Я отримую Error: Call to undefined method JController::getInstance()за це.
Olle Härstedt

6

Вибачте, якщо моя відповідь не стосується безпосередньо вашої проблеми, але важливо зрозуміти, що таке тестування блоку та як ним користуватися, незалежно від того, ми говоримо про Joomla чи ні. Ви вирішили багато питань, і з ними досить важко впоратися.

Перш за все важливо прочитати документацію на PHPUnit . Побудуйте собі невеликий клас (незалежно від Joomla) і спробуйте написати для цього кілька тестів. Спершу запускайте PHPUnit за таким сценарієм. Зрозумійте, що це робить. Боюся, що ви занадто зосереджуєтесь на тому, щоб PHPUnit запустився, а не розумів, як це допомагає вашому розвитку.

Щоб Joomla запустився , вам знадобиться:

  • bootstrap.php - що дасть вам примірник Joomla.
  • phpunit.xml - точна настройка параметрів PHPUnit. Корисно для прикладу введення одного разу для цілого проекту, де знаходяться тестові папки в кожному компоненті. Так що ви можете запустити набір тестів.

Помилка, яку ви отримуєте, є максимально зрозумілою. Joomla явно не завантажує "ContentController". Перевірте за допомогою налагоджувача, чи викликається автозавантажувач у Joomla і чому він не вдається завантажити клас. Найгірший сценарій - надайте власний автозавантажувач і використовуйте файл завантаження для його виклику. Швидке виправлення - це також завантаження необхідного файлу вручну за допомогою Requ_once.

Вирішіть, що ви хочете протестувати, і використовуйте макети

У наведеному прикладі ви використовуєте JModel для отримання даних із бази даних. З точки зору TDD це не можна. Тестування того, що ви можете отримати дані з бази даних, не має значення IMHO. Що саме ви там тестуєте?

Якщо вам потрібно працювати з даними з бази даних, використовуйте макети для моделювання відповіді з бази даних. Таким чином ваші тести матимуть послідовну поведінку з часом. Ви не хочете, щоб провалилися тести лише тому, що ви щось змінили в базі даних.

Якщо у вас є метод, який обчислює щось або щось інше, що має сенс перевірити. Це одиничне тестування: ви берете невелику одиницю зі своєї складної системи, годуєте її фальшивими тестовими даними та перевіряєте її поведінку.

Потрібно побачити, що ваша система працює в цілому, використовувати системні тести.


Вибачте, але ця відповідь не дуже актуальна. Раніше я використовував PHPUnit і розумію точку тестування. Я просто борюся, щоб мої тести навіть запустилися. Тест в моєму питанні не важливий, важлива частина - це те, що він працює. Я редагував своє запитання, сподіваючись зробити це зрозумілішим.
uozuAho
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.