📘 Глава 26. Тестирование кода в PHP. Введение в PHPUnit
🤔 Зачем тестировать код?
-
Надёжность — можно быть уверенным, что всё работает как задумано
-
Безопасные изменения — ты можешь менять код, не ломая старое
-
Автоматическая проверка — экономит время
✅ Что такое Unit-тест?
Unit-тест (модульный тест) — это маленький тест, который проверяет работу одной функции или метода.
Пример: проверить, что sum(2, 3)
действительно возвращает 5
.
🔧 Установка PHPUnit через Composer
composer require --dev phpunit/phpunit
Это добавит PHPUnit только для разработки.
📁 Пример структуры проекта с тестами
project/
├── src/
│ └── Calculator.php
├── tests/
│ └── CalculatorTest.php
├── composer.json
├── vendor/
└── phpunit.xml
📦 Класс, который мы будем тестировать
src/Calculator.php
:
namespace App;
class Calculator {
public function add(int $a, int $b): int {
return $a + $b;
}
public function divide(int $a, int $b): float {
if ($b === 0) {
throw new \InvalidArgumentException("Division by zero");
}
return $a / $b;
}
}
🧪 Создание теста
tests/CalculatorTest.php
:
use PHPUnit\Framework\TestCase;
use App\Calculator;
class CalculatorTest extends TestCase {
public function testAdd() {
$calc = new Calculator();
$this->assertEquals(5, $calc->add(2, 3));
}
public function testDivide() {
$calc = new Calculator();
$this->assertEquals(2.0, $calc->divide(4, 2));
}
public function testDivideByZero() {
$this->expectException(\InvalidArgumentException::class);
$calc = new Calculator();
$calc->divide(4, 0);
}
}
📄 Конфигурация: phpunit.xml
Создай файл phpunit.xml
в корне проекта:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="vendor/autoload.php">
<testsuites>
<testsuite name="My Test Suite">
<directory>tests</directory>
</testsuite>
</testsuites>
</phpunit>
🚀 Запуск тестов
vendor/bin/phpunit
📚 Основные методы TestCase
-
assertEquals($expected, $actual)
-
assertTrue($condition)
-
assertFalse($condition)
-
assertInstanceOf(ClassName::class, $object)
-
expectException(SomeException::class)
-
assertCount($count, $array)
Полный список: https://phpunit.de/manual
🧠 Полезные советы
-
Пиши тесты на ключевые участки логики
-
Не пиши тесты ради количества
-
Запускай тесты автоматически (например, через GitHub Actions)
-
Покрытие кода тестами — это не цель, а инструмент
✅ Что ты усвоил:
-
Что такое unit-тесты и зачем они нужны
-
Как установить и настроить PHPUnit
-
Как писать простые тесты и запускать их
⏭ В следующей главе:
Поговорим о современных возможностях PHP 8–8.5: аттрибутах, union types, named arguments, match, readonly, nullsafe и других вкусностях.