Показаны сообщения с ярлыком PHPUnit. Показать все сообщения
Показаны сообщения с ярлыком PHPUnit. Показать все сообщения

четверг, 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()
    {
        // ...
    }
}

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

четверг, 26 января 2012 г.

Как установить PHPUnit для MAMP

На работе я привык работать в CentOS/FreeBSD VM, на которой установлен Apache, nginx, PHP, MySQL и прочие необходимые инструменты для веб-разработки. Это удобно тем, что эта система максимально приближена к реальной обстановке проекта,чем минимизируются основные проблемы, связанные с настройкой различных сервисов.
Ну и VM всегда можно забекапить ;) По-этому, всегда можно безопасно экспериментировать.

Дома у меня MacBook с 2.5 Гб ОЗУ. С виртуалкой все очень тормозит. По-этому до того момента, пока я не разживусь еще одной планкой ОЗУ, приходится юзать MAMP. Вчера появилась задача настройки и запуска PHPUnit для MAMP. Приступим.

Для установки PHPUnit с помощью MAMP PEAR нам потребуется терминал с правами root-пользователя.

Сначала обноляем PEAR с помощью двух команд:
/Applications/MAMP/bin/php5/bin/pear channel-update pear.php.net
/Applications/MAMP/bin/php5/bin/pear upgrade pear

Теперь пришло время зарегистрировать соответствующий канал и установить PHPUnit:
/Applications/MAMP/bin/php5/bin/pear channel-discover pear.phpunit.de
/Applications/MAMP/bin/php5/bin/pear install phpunit/PHPUnit

PHPUnit теперь установлен, но чтобы запускаеть его с помощью терминала, нам нужно перенести его в $PATH:
mv /Applications/MAMP/bin/php5/bin/phpunit /usr/local/bin/phpunit

Для теста наберите:
phpunit --version

Вы увидите что-то вроде:
PHPUnit 3.6.9 by Sebastian Bergmann

Это все. Если есть вопросы, задавайте их в комментариях.
Читать далее

вторник, 13 декабря 2011 г.

Интересное поведение PHPUnit_Framework_Assert::assertEquals()

Сегодня узнал интересное поведение PHPUnit_Framework_Assert::assertEquals().

Данная проверка проходит так:
$result = true;
$this->assertEquals('You have not enough rights', $result, "bla bla bla");

и так:
$result = 'You have not enough rights';
$this->assertEquals('You have not enough rights', $result, "bla bla bla");

Интересно, правда? Чтобы тесты вернули свою актуальность, необходимо добавить еще один асерт - PHPUnit_Framework_Assert::assertInternalType():
$result = true;
$this->assertInternalType('string', $result);
$this->assertEquals('You have not enough rights', $result, "bla bla bla");

Читать далее