четверг, 23 февраля 2012 г.

Изолируем тесты в PHPUnit

Вчера столкнулся с ситуацией, когда из-за неправильного кода (в темплейте инициализировалась функция) падали тесты. Например, есть файл index.phtml с таким содержанием:
...
function showMenu()
{
    echo '
  • item1
  • item2
  • item3
'; } ...

Функция showMenu() выводит меню на странице. Программист по каким-то своим соображениям не захотел ее выносить в php-файл. Если мы заходим покрыть данный файл тестами, то уже на втором тесте получим фатал:
PHP Fatal Error: Cannot redeclare showMenu() (previously declared in /home/test/index.phtml) 

Самым лучшим выходом из данной ситуации будет рефакторинг кода: вынести функцию в php-файл или обернуть ее проверкой function_exist():
...
if (!function_exist('showMenu')) {
    function showMenu()
    {
        echo '
  • item1
  • item2
  • item3
'; } } ...

Но что делать когда мы не имеем права редактировать существующий код (в моей практике такое бывает очень часто)? Тогда нам на помощь приходят аннотации PHPUnit @runInSeparateProcess и @runTestsInSeparateProcesses. Они помогают изолировать тест-кейсы, запуская их в отдельных процессах.

@runTestsInSeparateProcesses позволяет изолировать все тест-кейсы:
/**
 * @runTestsInSeparateProcesses
 **/
class MyTest extends PHPUnit_Framework_TestCase
{
    public function testTest1()
    {
        // ...
    }

    public function testTest2()
    {
        // ...
    }
}

@runTestsInSeparateProcesses позволяет изолировать определенные тест-кейсы:
class MyTest extends PHPUnit_Framework_TestCase
{
    public function testTest1()
    {
        // ...
    }

    /**
     * @runInSeparateProcess
     **/
    public function testTest2()
    {
        // ...
    }
}

Надеюсь, эти аннотации помогут вам так же сильно, как помогли сегодня мне. Программируйте правильно о_О

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

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