Тестирование в PHP: обзор фреймворков и инструментов (PHPUnit, Pest, Codeception)

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение в тестирование 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.

Рекомендаций