Что такое PHPUnit и как его использовать?

    Что такое PHPUnit и как его использовать?

    PHPUnit – это самая известная в мире система для юнит-тестирования приложений, написанных на языке PHP. Автор сия творения – Себастьян Бергман, хотя проект оупенсорсный и его пишет много-много людей.

    В данной статье я рассмотрю установку PHPUnit и вкратце объясню, как им пользоваться.

    Что такое юнит-тесты?

    Идея юнит-тестирования состоит в том, чтобы проверять на корректность небольшие участки больших программ – прогонять на некоторых «хитрых» тестовых наборах данных.

    Нужно ли использовать юнит-тесты на каждом проекте? Я бы сказал, что далеко не всегда. Однако они просто необходимы на любом долгосрочном проекте.

    Установка PHPUnit на Windows

    Для начала убедитесь, что у вас установлена корректная версия PHP (на данный момент поддерживается версия PHP не ниже 5.6), а также установлен Composer.

    Самый простой способ установить PHPUnit – это скачать PHP архив (PHAR), который содержит все необходимые (а также некоторые дополнительные) зависимости PHPUnit в комплекте в одном файле.

    Для установки вам, возможно, надо будет включить в php.ini расширение OpenSSL. В общем, установка PHAR слегка похожа на процедуру ручной установки Composer на Windows:

    • Создайте каталог для PHP бинарных файлов; например, C:\bin;
    • В переменную среды PATH добавьте «;c:\bin»;
    • Скачайте https://phar.phpunit.de/phpunit.phar;
    • Если файл в названии содержит версию, переименуйте его в «phpunit.phar» и поместите в папку C:\bin;
    • Запустите командную строку Windows (Комбинация клавиш Windows + R , введите cmd и нажмите Enter);
    • Создайте обёрточный BAT-файл (C:\bin\phpunit.cmd): [code=bash]C:\Users\username> cd C:\bin C:\bin> echo @php "%~dp0phpunit.phar" %* > phpunit.cmd C:\bin> exit[/code]

    Закройте и заново откройте командную строку или перейдите в любую другую папку, отличную от c:\bin и попробуйте запустить phpunit --version. Вы должны увидет версию PHPUnit и копирайт:

    C:\Users\username> phpunit --version PHPUnit x.y.z by Sebastian Bergmann and contributors

    Подготовка проекта к тестированию

    Для начала нам необходимо инициализировать автозагрузчик классов, который будет связывать пространства имён (namespace) с директориями проекта.

    Например, нам надо чтобы при написании use SQL\Mysql нам подключался файл libs\sql\mysql.php, в файле composer.json необходимо написать:

    [code=javascript]{ "autoload": { "psr-0": {" ": "libs/"} } }[/code]

    Composer – это большая такая штука для управлением зависимостями, но мы её пока будем использовать просто для создания автозагрузчика. Далее необходимо из командной строки в папке проекта выполнить composer install.

    D:\WORK\project-example>composer install Loading composer repositories with package information Updating dependencies (including require-dev) Nothing to install or update Generating autoload files

    После данных манипуляций должна появится директория vendor, в которой (среди кучи вспомогательных файлов) будет заветный autoload.php. Можно было автозагрузчик написать самим всего в несколько строк кода, но мы же ленивые программисты. К тому же composer нам ещё пригодится.

    У PHPUnit есть два варианта запуска – с параметрами в командной строке или с файлом конфигурации. Мы пойдём по второму пути – в папке проекта создаём файл phpunit.xml. В данном файле мы опишем структуру тестов для нашего проекта. Вот пример:

    [code=xml] tests/UserTest 1.php tests/UserTest 2.php tests/MessagesTest1.php tests/MessagesTest1.php [/code]

    Как видите, файл состоит из секций testsuite, каждая секция описывает набор тестов. Далее в каждом тестовом наборе мы указываем какие файлы тестов подключать. Можно подключать как отдельные файлы, так и целые директории.

    Приступим к созданию самих тестов.

    Написание простейшего теста

    Основные концепции и шаги для написания тестов на PHPUnit:

    • Тесты для класса Class следует именовать ClassTest.
    • ClassTest обычно наследуется от PHPUnit\Framework\TestCase.
    • Все тесты – это публичные методы нашего ClassTest, их название должно начинаться на test.
    • Внутри этих методов для проверки чего-либо следует вызывать assert-методы. Такие как assertEquals(), например. Но на самом деле их большое количество.

    Пример теста из документации (тестирование обычных массивов):

    [code=php]use PHPUnit\Framework\TestCase; class StackTest extends TestCase{ public function testPushAndPop() { $stack = []; $this->assertEquals(0, count($stack)); array_push($stack, 'foo'); $this->assertEquals('foo', $stack[count($stack)-1]); $this->assertEquals(1, count($stack)); $this->assertEquals('foo', array_pop($stack)); $this->assertEquals(0, count($stack)); } }[/code]

    Как видите, ничего сложного.

    Послесловие

    Ну что ж, теперь стоит попробовать написать свою тестовую программу или же попробовать модульное тестирование на уже готовом проекте – уверен, что покрыв библиотеки тестами, вы только улучшите качество кода.

    Кроме того, PHPUnit можно использовать нестандартно – я, например, использую его для проверки лабораторных работ в рамках маленького курса по алгоритмам и структурам данных.

    Комментарии

    22.10.2016 10:42:48
    Avatar of shiziksamashiziksama
    хотелось бы поподробнее пример. Потому что я как-то смотрел на PHPUnit и, насколько я понял, нужен, чтобы не сломать обратную совместимость в отдельно взятом месте. Большую часть все равно не покроешь тестами. Или я не прав?
    22.10.2016 10:54:17
    Avatar of КонсервКонсерв
    @shiziksama
    По большой части - да.

    Для себя нашел пользу в 2-х случаях:
    1. Полезно на более-менее больших проектах (длительностью разработки более года)
    2. Проверялка лабораторных работ :-)
    23.10.2016 07:56:13
    Avatar of АлександрАлександр
    Открою для автора небольшой секрет. Актуальная версия php уже год как 7.0, и скоро 7.1 выходит!!!! Так на всякий случай.
    23.10.2016 07:59:19
    Avatar of КонсервКонсерв
    @Александр
    Пардон, имелось в виду версия не ниже 5.6.
    Поправил.

    Adding comments is temporarily disabled for unregistered users.

    Go Top