PHPUnit и тестирование PHP
PHPUnit и тестирование PHP
PHPUnit — стандарт xUnit для PHP: классы-тесты, утверждения (assert*), моки, data providers. Pest — синтаксис поверх PHPUnit (стиль Jest). В Laravel и Symfony тесты уже встроены в скелет проекта.
Обзор в экосистеме: Экосистема PHP-приложений. Общая теория тестирования: раздел тестирования.
Зачем тестировать PHP-код
| Уровень | Что проверяем | Пример |
|---|---|---|
| Unit | Одна функция/класс изолированно | расчёт скидки, валидатор |
| Integration | Несколько слоёв + БД | репозиторий + SQLite in-memory |
| Feature / HTTP | Маршрут end-to-end | GET /api/users → 200 + JSON |
Автотесты ловят регрессии при рефакторинге и документируют ожидаемое поведение.
Минимальный проект на PHPUnit
mkdir php-tests && cd php-tests
composer init -n
composer require --dev phpunit/phpunit ^11
composer.json — autoload для тестов:
{
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
}
}
src/Calculator.php:
<?php
namespace App;
final class Calculator
{
public function add(int $a, int $b): int
{
return $a + $b;
}
}
tests/CalculatorTest.php:
<?php
namespace Tests;
use App\Calculator;
use PHPUnit\Framework\TestCase;
final class CalculatorTest extends TestCase
{
public function test_adds_two_integers(): void
{
$calc = new Calculator();
$this->assertSame(5, $calc->add(2, 3));
}
/**
* @dataProvider additionProvider
*/
public function test_addition_provider(int $a, int $b, int $expected): void
{
$this->assertSame($expected, (new Calculator())->add($a, $b));
}
public static function additionProvider(): array
{
return [
[0, 0, 0],
[-1, 1, 0],
[100, 200, 300],
];
}
}
phpunit.xml:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="vendor/autoload.php" colors="true">
<testsuites>
<testsuite name="App">
<directory>tests</directory>
</testsuite>
</testsuites>
</phpunit>
Запуск:
./vendor/bin/phpunit
Моки и заглушки
use PHPUnit\Framework\TestCase;
final class MailerTest extends TestCase
{
public function test_sends_welcome_email(): void
{
$mailer = $this->createMock(MailerInterface::class);
$mailer->expects($this->once())
->method('send')
->with($this->stringContains('welcome'));
(new UserService($mailer))->register('a@b.c');
}
}
createMock подменяет зависимость; expects задаёт ожидания вызовов.
Pest (кратко)
composer require pestphp/pest --dev --with-dependencies
./vendor/bin/pest --init
test('addition works', function () {
expect((new Calculator())->add(2, 3))->toBe(5);
});
Pest совместим с PHPUnit-ассертами и отчётами CI.
Тестирование Laravel
В скелете Laravel уже есть tests/Feature и tests/Unit.
// tests/Feature/HelloTest.php
namespace Tests\Feature;
use Tests\TestCase;
class HelloTest extends TestCase
{
public function test_home_returns_ok(): void
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
php artisan test
# или
./vendor/bin/phpunit
Полезные приёмы:
RefreshDatabase— чистая БД на каждый тест;$this->actingAs($user)— авторизованный запрос;Http::fake()— подмена исходящих HTTP;Queue::fake()+Queue::assertPushed(SendEmail::class)— см. Laravel — очереди и политики.
Тестирование Symfony
composer require --dev symfony/test-pack
php bin/phpunit
WebTestCase для HTTP:
$client = static::createClient();
$client->request('GET', '/hello');
$this->assertResponseIsSuccessful();
CI
В GitHub Actions типичный шаг:
- run: composer install --no-interaction
- run: ./vendor/bin/phpunit --coverage-text
Связанные материалы
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). PHP как язык веб-разработки - роль серверного исполнения, базовый синтаксис и место в современном стеке. Экосистема PHP-приложений - фреймворки, инструменты, пакеты и типовые архитектурные подходы веб-разработки. Фундамент для начинающего программиста - что повторить, как работать, чего ожидать. Модель исполнения PHP - жизненный цикл запроса, серверный контекст и экосистема популярных CMS. История PHP - эволюция языка от простых скриптов до зрелой платформы серверной веб-разработки. Composer в PHP - управление зависимостями, автозагрузка классов и воспроизводимая сборка проектов. Параметр opcache.fast_shutdown ускоряет завершение работы скрипта за счёт пропуска стандартной процедуры освобождения памяти. Вместо этого используется механизм сборщика мусора операционной системы. Локальная среда разработки на PHP - настройка стека, запуск приложения и отладка без продакшен-сервера. Набор советов, правил, принципов и обычаев в разработке на этом языке. Фреймворки и библиотеки PHP - организация сервисов, вспомогательные компоненты и ускорение разработки веб-приложений. Гайд по установке и настройке с написанием первой программы и её запуском. Примеры простых и полезных консольных приложений с демонстрацией концепций языка.PHP - язык веб-разработки
Экосистема PHP-приложений
Что требуется знать перед началом изучения языка программирования PHP
Модель исполнения PHP
История языка PHP
Composer - управление зависимостями в PHP
Настройка веб-сервера для работы с PHP
Локальная среда разработки на PHP
Рекомендации по разработке на PHP
Фреймворки и библиотеки PHP
Первая программа на PHP
Простые приложения на PHP