TDD

TDD (Test-Driven Development) — сначала пишешь тест, потом код, который заставляет его пройти. Обратный порядок по сравнению с привычным “написал код → проверил вручную → может, добавил тест потом”.

Цикл red-green-refactor:

  1. Red — пишешь тест на функциональность, которой ещё нет. Тест падает (код ещё не написан).
  2. Green — пишешь минимальный код, чтобы тест прошёл. Не идеальный, просто рабочий.
  3. Refactor — улучшаешь код (убираешь дублирование, делаешь чище), не меняя поведения — тесты должны остаться зелёными.
// 1. Red — тест написан первым, метода sum ещё нет
@Test
void shouldSumTwoNumbers() {
    assertEquals(5, new Calculator().sum(2, 3));   // ❌ не компилируется/падает
}

// 2. Green — минимальный код, чтобы тест прошёл
class Calculator {
    int sum(int a, int b) { return a + b; }   // ✅ тест зелёный
}

// 3. Refactor — улучшаем при необходимости, тест остаётся зелёным
Копнуть глубже

Зачем писать тест первым, а не после кода:

  • Тест заставляет думать об интерфейсе заранее — как код будет использоваться, до того как погрузишься в детали реализации.
  • Гарантия покрытия. Если писать тесты после — легко забыть протестировать какой-то случай. TDD заставляет описать ожидаемое поведение до того, как код существует.
  • Безопасный рефакторинг. Зелёные тесты — это страховка: можно менять реализацию, не боясь сломать поведение незаметно.

TDD — это не панацея. В реальности многие команды не следуют TDD строго на 100% задач — особенно когда экспериментируют с подходом и сама архитектура ещё неясна. Но даже частичное использование (на критичной бизнес-логике) даёт ощутимую пользу в виде уверенности при изменениях.

🎤 Закрыл тему, если можешь объяснить:
• цикл red-green-refactor;
• зачем писать тест до кода, а не после (если дошёл до 2-го слоя).