Тестирование в PHP: фреймворки и инструменты для качественного кода

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

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

Начать курс

Тестирование в 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) —

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