Модульное тестирование
Оригинальное название: unit testing
Коротко
Автоматические тесты, каждый из которых проверяет одну небольшую часть кода — функцию, метод или класс — в изоляции от базы данных, сети и остального приложения.
Что такое «Модульное тестирование»
Модульный тест — это код, который вызывает другой код с заранее известными входными данными и сравнивает результат с ожидаемым. Таких тестов в проекте сотни, выполняются они за секунды, поэтому их запускают после каждого изменения — локально и в конвейере сборки. Если правка что-то сломала, упавший тест укажет конкретную функцию, а не просто сообщит, что «сайт не работает».
Английское название unit testing часто переводят калькой: «юнит-тесты».
Пример теста на PHPUnit
Для PHP стандартный фреймворк тестирования — PHPUnit. Тест проверяет расчёт скидки «10% от 5000» на граничных значениях:
use PHPUnit\Framework\TestCase;
final class DiscountTest extends TestCase
{
public function testDiscountStartsAtThreshold(): void
{
$calc = new DiscountCalculator(threshold: 5000, percent: 10);
$this->assertSame(4500.0, $calc->apply(5000.0));
$this->assertSame(4999.0, $calc->apply(4999.0));
}
}
Запуск — vendor/bin/phpunit tests. Такой тест сразу поймает логическую ошибку со строгим «больше» вместо «больше или равно». Структура почти любого теста одинакова: подготовить данные, выполнить действие, проверить результат. В JavaScript ту же роль играют Jest и Vitest, в Python — pytest.
Что считать «модулем»
Обычно это класс или функция с понятным входом и выходом. Всё внешнее — базу, HTTP-клиент, отправку почты — заменяют подставными объектами (моками и заглушками), которые возвращают заранее заданные ответы. Если код невозможно протестировать без настоящей базы, это сигнал о сильной связанности: логику полезно вынести из шаблонов и контроллеров в отдельные классы. Поэтому тесты не только проверяют, но и подталкивают к лучшему устройству кода.
Ограничения
- Модули могут работать по отдельности и не работать вместе — это ловят интеграционные и системные тесты.
- Процент покрытия сам по себе ничего не гарантирует: тест без проверок тоже «покрывает» код.
- Тесты требуют поддержки. Зато с ними безопасен рефакторинг: можно переписать внутренности и сразу узнать, сохранилось ли поведение.

