Введение в тестирование PHP-приложений
Тестирование — неотъемлемая часть профессиональной разработки на PHP. Оно позволяет выявлять ошибки на ранних этапах, упрощает рефакторинг и повышает стабильность кода. В экосистеме PHP сложился мощный набор инструментов: от классического PHPUnit до современных фреймворков вроде Pest и специализированных утилит для анализа покрытия и мутационного тестирования.
В этой статье мы рассмотрим ключевые фреймворки и инструменты, которые помогут вам организовать качественное тестирование PHP-проектов.
PHPUnit — основа тестирования
PHPUnit — де-факто стандарт для unit-тестирования в PHP. Он поддерживает все современные возможности: ассерты, фикстуры (setUp/tearDown), дата-провайдеры, тестирование исключений, заглушки (stubs) и моки (mocks).
Установка через Composer:
composer require --dev phpunit/phpunit
Пример простого теста для класса калькулятора:
<?php
use PHPUnit\Framework\TestCase;
class CalculatorTest extends TestCase
{
public function testAddition()
{
$calculator = new Calculator();
$this->assertEquals(4, $calculator->add(2, 2));
}
/** @dataProvider additionProvider */
public function testWithDataProvider($a, $b, $expected)
{
$calculator = new Calculator();
$this->assertEquals($expected, $calculator->add($a, $b));
}
public function additionProvider(): array
{
return [
[0, 0, 0],
[1, 1, 2],
[-1, 1, 0],
];
}
}
Ключевые возможности PHPUnit:
- Ассерты: assertEquals, assertTrue, assertCount, assertInstanceOf и десятки других.
- Фикстуры: методы setUp() и tearDown() для подготовки и очистки окружения.
- Дата-провайдеры: аннотация @dataProvider для запуска одного теста с разными наборами данных.
- Тестирование исключений: expectException() и expectExceptionMessage().
- Заглушки и моки: createMock() и getMockBuilder() для изоляции тестируемого кода.
Pest — элегантный и современный
Pest — это фреймворк для тестирования, построенный поверх PHPUnit, но с более лаконичным и выразительным синтаксисом. Он вдохновлён Jest (JavaScript) и отлично подходит для проектов, где важна читаемость тестов.
Установка:
composer require --dev pestphp/pest
Пример того же теста в Pest:
<?php
use function Pest\Faker\fake;
test('addition works correctly', function () {
$calculator = new Calculator();
expect($calculator->add(2, 2))->toBe(4);
});
dataset('numbers', [
[0, 0, 0],
[1, 1, 2],
[-1, 1, 0],
]);
test('addition with data provider', function ($a, $b, $expected) {
$calculator = new Calculator();
expect($calculator->add($a, $b))->toBe($expected);
})->with('numbers');
Преимущества Pest:
- Минимальный шаблонный код — не нужно создавать классы тестов.
- Встроенные функции expect(), test(), it() для естественно-языкового описания.
- Автоматическая регистрация тестов из глобальных функций.
- Поддержка вложенных наборов (describe) и архитектурных тестов.
Codeception — для интеграционного и BDD-тестирования
Codeception — это универсальный фреймворк, который объединяет unit, функциональные, интеграционные и приёмочные тесты. Он особенно популярен при тестировании веб-приложений (Laravel, Symfony, Yii) и API.
Установка:
composer require --dev codeception/codeception
Пример acceptance-теста для входа на сайт:
<?php
$I = new AcceptanceTester($scenario);
$I->amOnPage('/login');
$I->fillField('email', 'user@example.com');
$I->fillField('password', 'secret');
$I->click('Login');
$I->see('Welcome, user');
$I->seeCurrentUrlEquals('/dashboard');
Ключевые модули Codeception:
- PhpBrowser — эмуляция браузера без JavaScript (быстро).
- WebDriver — тестирование с реальным браузером (Selenium).
- REST — удобное тестирование API.