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

Что такое 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.
Поправил.
Captcha Обновить
Go Top