Модульное тестирование в PHP средствами PHPUnit
Всем доброго времени суток! Сегодня я хотел бы поговорить с Вами о том, что такое модульное тестирование в PHP.
При написании даже самых простых программ периодически приходиться останавливаться и проводить рефакторинг для того, чтобы понять правильно ли написана программа. А рефакторинге кода в PHP я уже рассказывал в одной из публикаций на сайте, с которой можно ознакомиться здесь.
В общем, конечно, данный подход неплох, однако у него есть существенные недостатки. Так, например, при написании, какого-либо достаточно крупного проекта, код будет постепенно засоряться закомментированными отладочными функциями, типа print или print_r.В случае работы над собственным проектом, код которого никто, ну или почти никто, читать не собирается, он, до некоторой поры, будет оправдан.
Однако давайте представим такую ситуацию: Вы пишете сайты для заказчиков на собственной системе управления контентом. Заказчики довольны, Вы чувствуете себя прекрасно, но в один день понимаете, что система, которую Вы разработали, уже не отвечает предъявляемым к ней требованиям, она нуждается в изменениях. И Вы начинаете переписывать одну часть системы за другой.
Наступает такой момент, когда один новый класс, метод, условие или цикл - рушат всю систему. Изменения в одном месте приводят к ошибкам в другом. И вот они уже лезут без конца, как из рога изобилия, и становиться понятно, что так дальше невозможно. А все было бы гораздо лучше, если бы сначала, помимо всего прочего, были бы написаны PHP Unit тесты. Не зря ведь говорит, Мартин Фаулер, что когда бы Вы ни пытались напечатать что-то через print в целях отладки или рефакторинга, лучше напишите это в виде Unit теста.
Итак, с теорией вроде ознакомились, теперь перейдем непосредственно к коду. Здесь необходимо сделать важные замечания, все операции проводятся на ПК под управлением Windows 7 c установленным PHP 7 версии. Дальше будет по пунктам.
1) Скачиваем по ссылке файл phpunit-6.3.0.phar, который представляет собой исполняемый PHP архив.
2) Загруженный файл перемещаем в папкуC:\bin. В этой же папке создаем файл phpunit.bat, записываем в него следующее содержимое:
@php C:\bin\phpunit-6.3.0.phar %*
Учтите, что путь C:\bin должен быть определен в системной переменной PATH, иначе при попытке выполнить в консоли команду phpunit Вы получите ошибку!
3) Откройте консоль и выполните команду phpunit, и если все правильно, то в консоли должна отобразиться справка.
Конечно, существуют и другие способы установки PHPUnit, однако я нашел данный способ наиболее приемлемым. За дополнительной информацией Вы всегда можете обратиться на официальный сайт проекта PHPUnit. Итак, установка завершена, теперь перейдем непосредственно, к коду.
<?php
// файл StackTest.php, расположен в каталоге C:/Projects/php/tests
// подключаем главный класс TestCase из пространства имен PHPUnit\Framework
use PHPUnit\Framework\TestCase;
// определяем тестируемый класс как наследник класса TestCase
class StackTest extends TestCase
{
// тестируемые функции являются публичными, начинаются со слова test
public function testPushAndPop()
{
$stack = []; // создали массив
// и проверили утверждение assert на то, что число элементов в массиве равно нулю
$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));
}
}
?>
Код хорошо комментирован, однако поясню пару моментов. Краеугольным камнем Unit тестирования является утверждение (assertion). Утверждение - это Ваше предположение об ожидаемом значении, или другими словами Вы утверждаете, что значение переменной, элемента массива, результат выполнения метода и т.д. будет равно такому-то значению. В примере выше, при первоначальном создании массива, ожидаемое значение его длины - 0. Так оно и есть на самом деле в нашем примере.
В данном случае мы используем только одно утверждение assertEquals, хотя в классе TestCase библиотеки PHPUnit их несколько десятков, на все случаи жизни, так сказать.
Так тест мы написали, а что дальше? А дальше его надо запустить. Для этого открываем консоль, переходим в папку с нашим тестом (PHP Unit тесты обычно располагаются в отдельной папке tests) и запускаем команду phpunit, передав ей в аргументе текущий каталог (обозначается одной точкой).
cd C:/Projects/php/tests && phpunit .
Данная команда автоматически пройдется по всем PHP тестам, которые есть в данном каталоге. По завершении выполнения, она выведет информацию о том, сколько тестов пройдено и, возможно, провалено.
Таким образом, сегодня мы с Вами выяснили что такое Unit тестирование в PHP, что применять его не только полезно, но и нужно. А если Вы знаете PHP плохо, или не знаете его совсем, то специально для Вас у меня есть отличный видеокурс "PHP и MySQL с Нуля до Гуру 2.0", в котором, я, в частности, подробно разбираю тему модульного (Unit) тестирования в PHP.
-
- Михаил Русаков
Комментарии (2):
А нет статьи где описывается как сделать регистрацию\вход\управление пользователями и т.д. всё вместе
Ответить
Здравствуйте! На сайте есть статьи по указанным Вами темам, их можно найти через форму поиска. Однако, если Вы хотите получить отличные знания по этим темам, то можете посмотреть курс, в котором эти темы разбираются очень подробно. Вот ссылка: https://srs.myrusakov.ru/php2?utm_source=MyRusakov.ru&utm_campaign=php2&utm_content=article_1017
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.