Ярлыки

.htaccess (4) тестирование (8) шаблоны проектирования (3) css (5) Debian (6) docker (2) Doctrine2 (6) Git (6) html (4) java (6) javascript (13) jquery (11) LFS (3) linux (23) mac os (4) mod_rewrite (2) MSSQL (4) MySQL (18) ORM Doctrine (17) patterns (3) PDO (3) perl (7) PHP (64) PHPUnit (8) Python (15) SEO (2) Silex (1) SimpleXML (1) SQL (14) ssh (4) Ubuntu (24) Yii1 (1) Zend Framework (19) ZendFramework2 (8)

вторник, 5 октября 2010 г.

Упрощенная организация тестирования с PHPUnit и NetBeans IDE

В NetBeans IDE тестовые классы PHPUnit можно создавать в контекстном меню (вызов контекстного меню для файла в дереве проекта). Подробно это описано в документации.

Для запуска тестов проекта NetBeans использует класс NetBeansSuite, который находится в моем случае в каталоге C:\Program Files\NetBeans 6.10 M1\php\phpunit\NetBeansSuite.php. Мы можем переопределить стандартную конфигурацию запуска тестов тремя способами:

1. Файл начальной загрузки (bootstrap file)
2. Файл конфигурации xml
3. Собственный класс расширяющий PHPUnit_Framework_TestSuite

В данном случае интересует вариант 3.
В каталоге с тестами проекта я создал файл MySuite.php

// MySuite.php

require_once 'MyClassATest.php';
require_once 'MyClassBTest.php';
require_once 'MyListener.php';

class MySuite extends PHPUnit_Framework_TestSuite
{
    public function  setUp()
    {
        parent::setUp();
        echo __METHOD__ . "\n";
    }

    public function  tearDown() 
    {
        parent::tearDown();
        echo __METHOD__ . "\n";
    }

    public static function suite() 
    {
        $suite = new MySuite();
        $suite->addTestSuite('MyClassATest');
        $suite->addTestSuite('MyClassBTest');
        return $suite;
    }

    public function  run(PHPUnit_Framework_TestResult $result = NULL,
        $filter = FALSE, array $groups = array(), array $excludeGroups = array(),
        $processIsolation = FALSE) 
    {
        if($result == NULL) 
        {
            $result = new PHPUnit_Framework_TestResult();
        }

        $result->addListener(new MyListener());

        parent::run($result, $filter, $groups, $excludeGroups, $processIsolation);
    }
}


В настройках проекта необходимо указать, что используем собственный класс и путь к нему. Теперь мы можем вызывать в методах setUp и tearDown все что нам нужно.

Запуск тестового набора ALT - F6 ...

PHPUnit 3.5.0 by Sebastian Bergmann.

MySuite::setUp
MyListener::startTest
MyClassATest::setUp
.MyListener::endTest
MyListener::startTest
MyClassATest::setUp
.MyListener::endTest
MyListener::startTest
MyClassBTest::setUp
IMyListener::endTest
MyListener::startTest
MyClassBTest::setUp
IMyListener::endTest
MySuite::tearDown


Time: 1 second, Memory: 4.00Mb

OK, but incomplete or skipped tests!
Tests: 4, Assertions: 1, Incomplete: 2.

Классы модели наследуют определенный супер-класс. В моем случае это Doctrine_Record.
Для того чтобы можно было создавать тесты классов из контекстного меню (Tools -> Create PHPUnit tests), необходимо создать bootstrap.php.

// bootstrap.php

function myAutoloader($className) 
{
    if(class_exists($className) === false)
        @require_once implode('/', explode('_', $className)) . '.php';
}

define('DOCROOT', realpath(dirname(__FILE__) . '/..'));
define('DOCTRINE_PATH', DOCROOT . '/library');
define('MODELS_PATH', DOCROOT . '/application/models');

set_include_path
(
    get_include_path() .
    PATH_SEPARATOR . MODELS_PATH .
    PATH_SEPARATOR . DOCROOT . '/tests/application/models'
);

require_once DOCTRINE_PATH . '/Doctrine.php';
spl_autoload_register(array('Doctrine', 'autoload'));
spl_autoload_register(array('Doctrine', 'modelsAutoload'));
spl_autoload_register('myAutoloader');

// Модель, которая будет использоваться для генерации таблиц sqlite
Doctrine_Core::setModelsDirectory(MODELS_PATH);
Doctrine_Core::loadModels(MODELS_PATH);

Что-то вроде этого ...

В настройках проекта указываем bootstrap и указываем, что используем его для генерации классов. Вызов Skeleton Generator PHPUnit также имеет опцию bootstrap.

Таким образом мы инициализируем все автозагрузчики классов.

Комментариев нет:

Отправить комментарий