Автоматическая генерация тестов для PHP проектов с использованием Pest

Автоматическая генерация тестов для PHP проектов с использованием Pest

В современном мире разработки программного обеспечения качество и надежность занимают первостепенное место. Автоматизированное тестирование — неотъемлемая часть этого процесса, и чем меньше усилий требуется для написания и запуска тестов, тем лучше. В PHP-мире существует множество инструментов для тестирования, и сегодня мы погрузимся в мир Pest – элегантного и быстрого фреймворка для тестирования, который упрощает создание тестов и делает их более читаемыми. Pest стремится предложить простоту и удобство использования, предоставляя мощные возможности "из коробки".

В этой статье мы рассмотрим, как Pest может помочь автоматизировать создание тестов для ваших PHP-проектов, от простых юнит-тестов до интеграционных проверок. Мы не будем просто перечислять команды; мы покажем, как Pest позволяет писать более чистый и понятный код тестов, а также как он может упростить жизненный цикл разработки. Цель – дать вам практические знания, которые вы сможете сразу же применить в своих проектах.


Что такое Pest и почему он нужен?

Pest, разработанный Christopher Such, - это фреймворк для тестирования, разработанный специально для PHP. Он построен на основе PHPUnit, но предоставляет более лаконичный синтаксис и удобные фичи. В отличие от PHPUnit, Pest делает акцент на простоте и легкости использования.

Что делает Pest таким привлекательным?

* Минималистичный синтаксис: Pest отказывается от громоздкого синтаксиса PHPUnit, позволяя писать тесты более лаконично и читабельно.

* Автоматическое внедрение зависимостей: В Pest вы можете использовать статические методы test() и expect(), которые автоматически разрешают зависимости, что избавляет от необходимости ручной настройки моков и стабов.

* Массивы по умолчанию: Pest позволяет использовать массивы PHP в качестве входных данных для ваших тестов, что упрощает тестирование сложных структур данных.

* Поддержка Laravel: Pest тесно интегрирован с Laravel, но может использоваться и с другими PHP-фреймворками.

* Быстрая работа: Благодаря оптимизации и использованию кэширования, Pest работает значительно быстрее, чем PHPUnit в некоторых сценариях.

> Важно: Pest не является заменой PHPUnit, а скорее его современной и более удобной альтернативой. Он использует PHPUnit под капотом, но предоставляет более приятный опыт разработки тестов.


Установка и настройка Pest

Установка Pest - это простой процесс, особенно если вы используете Composer.

1. Установка Pest:

composer require pestphp/pest --dev

2. Создание файла pest.php (необязательно):

Этот файл позволяет настроить Pest, например, указать путь к каталогу с тестами. Обычно Pest автоматически определяет местоположение тестов. Если у вас возникли проблемы, вы можете настроить его в файле pest.php. Пример:

<?php
return [
'paths' => [
'tests' => 'tests', // Путь к каталогу с тестами
'support' => 'tests/support', // Путь к каталогу с вспомогательными файлами
],

3. Настройка PHPUnit (если необходимо):

Если вы используете PHPUnit в своем проекте, Pest может использовать его конфигурацию. Убедитесь, что ваш phpunit.xml правильно настроен, если Pest не работает должным образом.


Написание простых тестов с Pest

Теперь перейдем к написанию тестов! Предположим, у нас есть простая функция для сложения двух чисел:

<?php
function add(int $a, int $b): int
{
return $a + $b;

Тест для этой функции в Pest будет выглядеть следующим образом:

<?php
use Pest\TestSuite;
return new TestSuite(function (Test $test) {
$test->expect(add(2, 3))->toBe(5);

Разберем этот код:

* use Pest\TestSuite;: Импортируем класс TestSuite.

* return new TestSuite(function (Test $test) { ... });: Создаем TestSuite, в котором определяем тестовый набор.

* $test->expect(add(2, 3))->toBe(5);: Ключевая строка. $test->expect() - это "assertion" (утверждение), которое говорит Pest, что ожидаем определенный результат. Мы вызываем функцию add(2, 3) и утверждаем (toBe), что результат должен быть равен 5.

Чтобы запустить тест, просто выполните команду:

vendor/bin/pest

Pest выполнит все тесты в каталоге tests и отобразит результаты.


Использование beforeEach и afterEach

Pest предоставляет удобные методы beforeEach и afterEach для настройки и очистки состояния перед и после каждого теста. Это особенно полезно, если вам нужно инициализировать объекты или выполнять какие-то действия перед каждым тестом.

Предположим, у нас есть класс Calculator, который использует базу данных:

<?php
class Calculator
{
protected $db;
public function __construct(PDO $db)
{
$this->db = $db;
}
public function calculate(): int
{
// Выполнение сложной логики с использованием базы данных
$stmt = $this->db->prepare('SELECT SUM(value) FROM data');
$stmt->execute();
return $stmt->fetchColumn();
}

Мы можем использовать beforeEach для установления соединения с базой данных и afterEach для закрытия соединения:

<?php
use Pest\TestSuite;
use PDO;
return new TestSuite(function (Test $test) {
$test->beforeEach(function () {
// Устанавливаем соединение с базой данных
$this->db = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
});
$test->afterEach(function () {
// Закрываем соединение с базой данных
$this->db = null;
});
$test->expect(new Calculator($this->db)->calculate())->toBe(10);


Группировка тестов и параметризация

Pest позволяет группировать тесты и параметризовать их для повышения переиспользуемости и охвата тестами. Используйте group() для создания логических блоков тестов, и with() для параметризации тестов.

Предположим, нам нужно протестировать функцию add с разными входными данными:

<?php
use Pest\TestSuite;
return new TestSuite(function (Test $test) {
$test->group('Addition Tests')->with([
[2, 3, 5],
[1, 1, 2],
[-1, 1, 0],
])->expect(function (int $a, int $b, int $expected) {
return add($a, $b) == $expected;
});

Объяснение:

* $test->group('Addition Tests'): Группируем тесты под названием "Addition Tests".

* with([ ... ]): Передаем массив параметров в тест.

* function (int $a, int $b, int $expected) { ... }: Функция, которая выполняется для каждого набора параметров. Мы распаковываем параметры $a, $b и $expected и вызываем функцию add с этими параметрами, проверяя, что результат соответствует ожидаемому значению $expected.


Заключение

Pest – это мощный и элегантный фреймворк для тестирования, который значительно упрощает процесс написания и запуска тестов в PHP-проектах. Его минималистичный синтаксис, автоматическое внедрение зависимостей и удобные фичи, такие как beforeEach, afterEach, группировка и параметризация, позволяют создавать более чистый, читаемый и поддерживаемый код тестов. Переход на Pest – отличный способ повысить качество и скорость разработки ваших PHP-приложений. Начните использовать Pest уже сегодня и почувствуйте разницу! Не бойтесь экспериментировать и создавать свои собственные фичи и расширения для Pest, чтобы адаптировать его под свои нужды.