Модульное тестирование

Оригинальное название: 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-клиент, отправку почты — заменяют подставными объектами (моками и заглушками), которые возвращают заранее заданные ответы. Если код невозможно протестировать без настоящей базы, это сигнал о сильной связанности: логику полезно вынести из шаблонов и контроллеров в отдельные классы. Поэтому тесты не только проверяют, но и подталкивают к лучшему устройству кода.

Ограничения

  • Модули могут работать по отдельности и не работать вместе — это ловят интеграционные и системные тесты.
  • Процент покрытия сам по себе ничего не гарантирует: тест без проверок тоже «покрывает» код.
  • Тесты требуют поддержки. Зато с ними безопасен рефакторинг: можно переписать внутренности и сразу узнать, сохранилось ли поведение.

Обновлено:

Все термины раздела «Backend»

Что будем искать? Например,Продвижение