Unit-тестирование — это практика проверки отдельных изолированных частей кода (юнитов) на корректность работы. PHPUnit — стандартный инструмент для этого в PHP-экосистеме.
Базовый класс теста наследуется от PHPUnit\Framework\TestCase
:
use PHPUnit\Framework\TestCase;
class CalculatorTest extends TestCase
{
// Тестовые методы начинаются с test*
public function testAddTwoNumbers(): void
{
$calculator = new Calculator();
$result = $calculator->add(2, 3);
$this->assertEquals(5, $result);
}
}
Метод | Проверка |
---|---|
assertEquals() |
Равенство значений |
assertTrue() |
Истинность значения |
assertCount() |
Количество элементов массива |
assertInstanceOf() |
Принадлежность к классу |
assertStringContainsString() |
Наличие подстроки |
public function testDivisionByZero(): void
{
$this->expectException(DivisionByZeroError::class);
$calculator = new Calculator();
$calculator->divide(10, 0);
}
Для подготовки и очистки окружения:
protected function setUp(): void
{
$this->calculator = new Calculator();
$this->logger = new TestLogger(); // Заглушка
}
protected function tearDown(): void
{
unset($this->calculator);
}
Использование TestCase::createMock()
для замены зависимостей:
public function testPaymentProcessing(): void
{
$paymentGateway = $this->createMock(PaymentGateway::class);
$paymentGateway->method('process')
->willReturn(true);
$processor = new PaymentProcessor($paymentGateway);
$this->assertTrue($processor->makePayment(100));
}
Для тестирования с разными наборами данных:
/**
* @dataProvider additionProvider
*/
public function testAdd(int $a, int $b, int $expected): void
{
$this->assertEquals($expected, $this->calculator->add($a, $b));
}
public function additionProvider(): array
{
return [
[1, 1, 2],
[0, 5, 5],
[-1, 1, 0],
];
}
Через рефлексию (использовать осторожно!):
public function testPrivateMethod(): void
{
$class = new MyClass();
$reflector = new ReflectionClass($class);
$method = $reflector->getMethod('privateMethod');
$method->setAccessible(true);
$result = $method->invokeArgs($class, ['param']);
$this->assertEquals('expected', $result);
}
methodName_Scenario_ExpectedBehavior
Пример phpunit.xml:
<phpunit bootstrap="vendor/autoload.php">
<testsuites>
<testsuite name="unit">
<directory>tests/Unit</directory>
</testsuite>
</testsuites>
<coverage>
<include>
<directory>src</directory>
</include>
</coverage>
</phpunit>
PHPUnit предоставляет мощный инструментарий для создания изолированных, поддерживаемых и надежных unit-тестов. Грамотное тестирование значительно снижает количество багов в production и облегчает рефакторинг кода.