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

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

Ответ

TDD (Разработка через тестирование) — это методология разработки программного обеспечения, в которой цикл создания функциональности строго следует трём этапам («красный — зелёный — рефакторинг»), и тест пишется до реализации кода.

Цикл TDD (Красный/Зелёный/Рефакторинг):

  1. Красный (Red): Написание непроходящего unit-теста для ещё несуществующей или неполной функциональности. Запуск теста подтверждает его падение.
  2. Зелёный (Green): Написание минимального количества кода, необходимого для того, чтобы новый тест прошёл, не нарушая при этом существующие тесты. Цель — быстро получить работающую реализацию.
  3. Рефакторинг (Refactor): Улучшение структуры написанного кода (устранение дублирования, улучшение читаемости, применение паттернов) без изменения его внешнего поведения. После рефакторинга все тесты должны оставаться «зелёными».

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

# 1. RED: Пишем падающий тест (функции add() ещё нет)
def test_add():
    assert add(2, 3) == 5  # AssertionError: NameError: name 'add' is not defined

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

# 3. REFACTOR: Улучшаем код, если нужно (здесь улучшать нечего)
# Можно, например, добавить обработку других типов данных.

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

  • Высокое покрытие тестами: Код изначально пишется для прохождения тестов.
  • Проектирование через тесты: Тест выступает как первая спецификация, что ведёт к более продуманному API.
  • Уверенность при рефакторинге: Набор тестов защищает от регрессий.
  • Более простая отладка: Если тест падает, проблема, скорее всего, в только что написанном коде.

Недостатки/Сложности:

  • Замедление на старте: Требуется время на написание тестов.
  • Сложность для UI и интеграционных тестов: Классический TDD лучше всего работает на уровне модулей и unit-тестов.
  • Требует дисциплины: Отход от цикла снижает эффективность методики.