- PVSM.RU - https://www.pvsm.ru -

Простой инструмент для тестирования PHP приложений

Для кого эта статья

Скорее всего для тех, кто ещё не начал тестировать, но имеет такое желание. Опытных в этом деле разработчиков удивить не получится, но тех кто ещё не перешел на сторону света, попробую подтолкнуть на этот шаг.

Предыстория

Решил разобраться с автоматическим тестированием. Раньше этого делать не приходилось, да и тогда не было особо нужно. Зато было свободное время, которое решил потратить с пользой на будущее.
Почитав теорию, начал искать инструмент для этого. Предсказуемо первым на горизонте показался PhpUnit [1]. Но он показался каким-то громоздким, что ли.
Более удобным показался Codeception [2] — разные виды тестов, выразительный синтаксис. Но, посмотрев зависимости, я понял, что мне столько всего не нужно.
Двигаясь в сторону простоты, я нашел atoum [3], а потом вообще классную вещь под названием Testify.php [4]. Тут-то я подумал, что наконец нашел то, что мне нужно.

Но я рано радовался. Testify.php не подошел при написании первого же теста. Тестировался класс кэширования, который в зависимости от того, включена отладка или нет, мог обрабатывать или игнорировать вызовы. Так как режим отладки предполагал наличие константы DEBUG со значением true/false — переопределить её в одном процессе не получится.

Требования

После этих поисков я понял, что нужен простой инструмент, который:

  • Будет тестировать в разных процессах, чтобы определять нужные константы, mock-ать одни и те же классы для разных тестов по разному, и т.д.
  • Будет максимально простым в использовании
  • Сможет работать как через браузер, так и с командной строки
  • Можно будет использовать вместе с Travis CI [5] (консольный вариант — в случае успешного тестирования должен вернуть статус 0)

Реализация

Был написан небольшой скрипт, который открывал тесты по http, собирал результаты, и выдавал в презентабельном HTML виде. Для того, чтобы сделать аналогичным процесс тестирования и для консольного варианта — было решено использовать встроенный в PHP 5.4+ веб-сервер. Запускается он так:

//Запуск
$web_server_pid = exec("php -S localhost:$this->port >/dev/null 2>/dev/null & echo $!");
//Тестирование
//...
//Остановка
exec("kill $web_server_pid");

И оно заработало как положено. Так, как аналогичного инструмента не нашел — решил оформить в виде самостоятельного composer пакета, добавил интерактивности (прогресс выполнения наборов тестов отображается в реальном времени как в HTML, так и в консольном варианте).

Запуск тестов:

// test.php
require __DIR__.'/vendor/autoload.php';
(new nazarpcCSTester(__DIR__.'/tests'))->run();

Теперь этот файл можно открыть либо в браузере, либо в консоли

php test.php

Сами тесты не на много сложнее:

return 5 != 3 ? 0 : 'Strange PHP';

То есть, каждый отдельный тест являет собой файл, который возвращает 0 после успешного тестирования или текст ошибки, если она возникла.

Пример результата консольного варианта:

Простой инструмент для тестирования PHP приложений

Есть возможность выполнить общие команды как перед всеми наборами тестов, так и перед всеми тестами одного набора.

Уверен, что можно сделать еще лучше, поэтому жду конструктивной критики и предложений.
Зависимостей никаких, голый PHP 5.4+ подойдёт.

GitHub репозиторий: github.com/nazar-pc/CSTester [6]
Composer пакет: packagist.org/packages/nazar-pc/cstester [7]

Автор: nazarpc

Источник [8]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/php-2/39813

Ссылки в тексте:

[1] PhpUnit: https://github.com/sebastianbergmann/phpunit

[2] Codeception: https://github.com/Codeception/Codeception

[3] atoum: https://github.com/atoum/atoum

[4] Testify.php: https://github.com/marco-fiset/Testify.php

[5] Travis CI: https://travis-ci.org

[6] github.com/nazar-pc/CSTester: https://github.com/nazar-pc/CSTester

[7] packagist.org/packages/nazar-pc/cstester: https://packagist.org/packages/nazar-pc/cstester

[8] Источник: http://habrahabr.ru/post/188342/