воскресенье, 9 января 2011 г.

Настройка окружения: phpUnit

Перечитал много статей о том насколько хорошо писать тесты и какие они вообще бывают, но не нашел ни одного поста о том как настраивать окружение. Здесь расскажу как настроить окружение phpUnit (+ubuntu+NetBeans).
Итак,

Для начала необходимо установить pear (если не установлен):
~$ sudo apt-get install php-pear
должна установиться последняя версия, на момент написания этой статьи - это 1.9.1, смотрим
~$ pear -V
PEAR Version: 1.9.4
PHP Version: 5.3.10-1ubuntu3.6
Zend Engine Version: 2.3.0
Далее делаем по инструкции в офф. документации Chapter 3. Installing PHPUnit
~$ sudo pear config-set auto_discover 1
~$ sudo pear install pear.phpunit.de/PHPUnit
Помимо самого phpUnit установятся PHPUnit_MockObject, PHP_CodeCoverage и еще куча всяких штук. Проверяем
~$ phpunit --version
PHPUnit 3.7.19 by Sebastian Bergmann.
Супер! phpUnit установлен и работает. проверим,

В своем проекте создадим папку /tests и /tests/reports, в этой папке создадим файл phpunit.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<phpunit
    colors="true"
    convertErrorsToExceptions="true"
    convertNoticesToExceptions="true"
    convertWarningsToExceptions="true"
    stopOnFailure="true"
    syntaxCheck="true">

    <testsuite name="my Test Suite">
        <directory>./</directory>
    </testsuite>

    <logging>
     <log type="coverage-html" target="./reports/coverage" charset="UTF-8" yui="true" highlight="true" lowUpperBound="35" highLowerBound="70"/>
     <log type="coverage-xml" target="./reports/coverage/clover.xml"/>
     <log type="junit" target="./reports/phpunit.xml" logIncompleteSkipped="false"/>
    </logging>
</phpunit>
опции говорят сами за себя, а подробнее об опциях можно почитать здесь: Appendix C. The XML Configuration File 

Теперь в NetBeans кликнув на файле описании какого-то класса правой кнопкой Tools/Create PHPUnit tests


создастся файл теста с методами пустышками. В любом методе напишем
$this->assertTrue(TRUE, 'This should already work.');
вместо
$this->markTestIncomplete(
    'This test has not been implemented yet.'
);

Можно его сразу запустить и проверить работоспособность, увидим
 Теперь для полного счастья чтобы не запускать каждый тест по отдельности, создадим в папке /tests файлы AllTests.php
require_once 'ProjTestSuite.php';

class AllTests {
  public static function suite() {
    $suite = new PHPUnit_Framework_TestSuite('proj project');

    $suite->addTest(ProjTestSuite::suite());

    return $suite;
  }
}

и ProjTestSuite.php
require_once 'path/to/my/SomeTestCase.php';

class ProjTestSuite {
    public static function suite() {
        $suite = new PHPUnit_Framework_TestSuite('proj test suite');

        $suite->addTestSuite('SomeTestCase');
        // сюда будем добавлять тест кейсы

        return $suite;
    }
}

Вот и все, теперь для запуска тестов необходимо запускать AllTests.php. Так же в /tests/reports/coverage/index.html можно увидеть покрытия кода тестами и рискованные (CRAP) методы.

Пока добавление тест кейсов выглядит не очень удобным, ведь надо создать строку в класе набора (Suite) и добавить require_once, предложите более удобный вариант :)

Удачного вам тестирования и чистого кода.

Ссылки по теме:
TDD - Разработка через тестирование
Юнит-тестирование в PHP
PHPUnit. Автоматические тесты
PHPUnit и покрытие кода (Source code coverage)
PHPUnit Manual

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

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