Тестирование в PHP: фреймворки и инструменты
Качественное тестирование — основа надёжного веб-приложения. В экосистеме PHP сложился мощный набор инструментов, охватывающий все уровни: от модульных (unit) тестов до приёмочных (acceptance). В этой статье разберём основные фреймворки и библиотеки, которые помогут вам писать чистый, проверяемый код.
1. PHPUnit — стандарт де-факто
PHPUnit остаётся самым популярным фреймворком для модульного тестирования в PHP. Он входит в состав Symfony, Laravel и многих других проектов. Основные возможности:
- Поддержка ассертов (assertions) — от простых
assertEqualsдо сложныхassertJsonStructure. - Фикстуры для подготовки и очистки данных (
setUp(),tearDown()). - Генерация отчётов в форматах HTML, XML, Clover.
- Интеграция с CI/CD (GitHub Actions, GitLab CI, Jenkins).
<?php
use PHPUnit\Framework\TestCase;
class CalculatorTest extends TestCase
{
public function testAddition()
{
$calc = new Calculator();
$this->assertEquals(4, $calc->add(2, 2));
}
public function testDivisionByZero()
{
$this->expectException(\DivisionByZeroError::class);
$calc = new Calculator();
$calc->divide(10, 0);
}
}
2. Mockery — гибкое создание заглушек
Mockery расширяет возможности PHPUnit по созданию mock-объектов. Она удобна, когда нужно подменить сложный сервис или базу данных.
- Поддержка частичного мокинга (partial mocks).
- Проверка порядка вызовов методов (
shouldReceive). - Работа с магическими методами (
__call,__get).
<?php
use Mockery as m;
class OrderProcessorTest extends TestCase
{
public function testProcess()
{
$gateway = m::mock(PaymentGateway::class);
$gateway->shouldReceive('charge')
->once()
->with(100.0)
->andReturn(true);
$processor = new OrderProcessor($gateway);
$this->assertTrue($processor->process(100.0));
}
protected function tearDown(): void
{
m::close();
}
}
3. Codeception — всё в одном
Codeception объединяет модульные, функциональные и приёмочные тесты в едином синтаксисе. Особенно популярен в веб-проектах, где нужно тестировать формы, AJAX-запросы и базы данных.
- Модули для работы с PHPBrowser, Selenium, Laravel, Symfony.
- Генерация тестов через CLI:
codecept generate:test. - Поддержка BDD (Behavior-Driven Development) через Gherkin.
<?php
// acceptance.suite.yml
actor: AcceptanceTester
modules:
enabled:
- WebDriver:
url: 'http://localhost'
browser: chrome
- Laravel5:
environment_file: .env.testing
// tests/acceptance/LoginCept.php
$I = new AcceptanceTester($scenario);
$I->wantTo('see that login form works');
$I->amOnPage('/login');
$I->fillField('email', 'user@example.com');
$I->fillField('password', 'secret');
$I->click('Login');
$I->see('Dashboard');
4. Pest — минималистичный синтаксис
Pest — современная альтернатива PHPUnit с лаконичным синтаксисом, вдохновлённым JavaScript-библиотекой Jest. Идеален для тех, кто ценит читаемость тестов.
- Автоматическое разрешение зависимостей.
- Цепочки ассертов:
expect($result)->toBeTrue(). - Встроенная поддержка параллельного запуска.
<?php
use function Pest\Faker\faker;
test('it creates a user', function () {
$user = User::factory()->create([
'name' => faker()->name,
'email' => faker()->email,
]);
expect($user)->toBeInstanceOf(User::class);
expect($user->email)->not->toBeEmpty();
});
test('it validates email', function () {
$response = $this->post('/register', [
'email' => 'invalid-email',
]);
$response->assertSessionHasErrors('email');
});
5. Инструменты для покрытия и анализа
Помимо фреймворков, полезно использовать вспомогательные утилиты:
- PHP_CodeSniffer — проверка стиля кода (PSR-12).
- PHPMD (PHP Mess Detector) —