Тренируем Test-Driven Development (TDD)

TDD (Test-Driven Development) — дисциплина разработки, в которой тест появляется раньше production-кода. Подход строится на коротком цикле Red -> Green -> Refactor. В разделе тестирования TDD рассматривается вместе с уровнями тестов (unit, integration, E2E) и с BDD; в методологиях — как инженерная практика Agile/XP рядом с CI/CD и рефакторингом.


Что дает TDD на практике

  • быстрее выявляет ошибки в требованиях;
  • снижает число регрессий;
  • формирует модульный и читаемый код;
  • дает уверенность при рефакторинге.

Базовые понятия

  • Red — новый тест падает, потому что функциональность отсутствует.
  • Green — минимальная реализация, которая делает тест зеленым.
  • Refactor — улучшение структуры кода при зеленых тестах.
  • Test suite — набор тестов проекта.

Пошаговый учебный кейс

Задача: написать функцию расчета скидки.

Правила:

  1. если сумма заказа меньше 1000, скидка 0%;
  2. от 1000 до 4999 — скидка 5%;
  3. от 5000 — скидка 10%.

Шаг 1. Red

Сначала пишем тесты (пример на Python + pytest). Вкладки test_discount.py и discount.py:

Запуск тестов даст ошибку, потому что функции еще нет.


Шаг 2. Green

Минимальная реализация — во вкладке discount.py (см. пример выше). Снова запустите тесты. На этом этапе цель — зеленый результат.


Шаг 3. Refactor

Улучшите код, сохраняя зеленые тесты:

  • уточните имена переменных;
  • добавьте обработку граничных значений;
  • вынесите повторяющиеся части в отдельные функции.

После каждого изменения запускайте тесты.


Правила эффективного TDD

  1. один маленький шаг за итерацию;
  2. тест описывает бизнес-ожидание;
  3. код пишется только под текущий падающий тест;
  4. рефакторинг начинается после зеленого статуса.

Частые ошибки

  • длинный код до первого теста;
  • попытка покрыть все случаи в одном огромном тесте;
  • пропуск фазы рефакторинга;
  • тестирование деталей реализации вместо поведения.

Практическое задание

Сделайте вторую итерацию кейса:

  1. добавьте правило "для отрицательной суммы выбрасывать ValueError";
  2. напишите тест на это поведение;
  3. реализуйте код;
  4. приведите функции и тесты к чистому виду.

Критерии результата

  • все тесты зеленые;
  • каждый тест читабельно описывает бизнес-правило;
  • код проходит рефакторинг без изменения поведения;
  • в проекте есть привычка писать новый код через цикл Red -> Green -> Refactor.

Рекомендую читать в энциклопедии

Тема Материал
TDD, BDD и уровни тестов Unit, Integration, UI, E2E, TDD и BDD
Раздел тестирования (маршрут QA и SDET) Тестирование ПО — о разделе
Unit-тесты Unit-тестирование
Методологии и SDLC Методология и жизненный цикл ПО
Жизненный цикл, Scrum, DevOps Жизненный цикл программного обеспечения
Чек-лист «используется ли TDD в проекте» Самопроверка методологии