Что такое TDD (Test-Driven Development)?

«Что такое TDD (Test-Driven Development)?» — вопрос из категории Тестирование, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

TDD (Test-Driven Development, Разработка через тестирование) — это методика разработки программного обеспечения, в которой цикл написания кода состоит из трех коротких этапов, повторяемых для каждой новой функциональности:

  1. Красный (Red): Написание падающего теста.

    • Сначала пишется минимальный тест для новой функции, который заведомо не проходит, так как сама функция еще не реализована.
    • Это помогает четко определить требования и интерфейс будущего кода.
  2. Зеленый (Green): Реализация функции.

    • Пишется минимальный объем кода, необходимый для прохождения написанного теста.
    • Цель — быстро получить работающий код, не заботясь об оптимальности или «красоте».
  3. Рефакторинг (Refactor): Улучшение кода.

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

Практический пример на Python (сложение чисел):

# 1. RED: Пишем тест (используем pytest)
def test_calculator_sum():
    calc = Calculator()
    assert calc.sum(2, 3) == 5  # Этот тест упадет

# 2. GREEN: Пишем минимальную реализацию
class Calculator:
    def sum(self, a, b):
        return a + b  # Теперь тест проходит

# 3. REFACTOR: Улучшаем код (например, добавляем обработку большего количества аргументов)
class Calculator:
    def sum(self, *args):
        return sum(args)
# Запускаем тест снова — он все еще должен проходить.

Преимущества TDD:

  • Лучший дизайн: Код становится более модульным и тестируемым с самого начала.
  • Живая документация: Тесты служат примером использования API.
  • Смелость рефакторинга: Полная тестовая оболочка позволяет безопасно вносить изменения.
  • Меньше дефектов: Покрытие тестами близко к 100% для новой функциональности.

Сложности: Требует дисциплины и может замедлять начальную разработку простых функций, но окупается на средних и сложных проектах.