В чем разница между TDD, тестированием после кода и тестированием параллельно с кодом?

«В чем разница между TDD, тестированием после кода и тестированием параллельно с кодом?» — вопрос из категории Тестирование, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

TDD (Test-Driven Development) — методика, при которой тесты пишутся до реализации кода.

Цикл TDD (красный-зеленый-рефакторинг):

  1. Красный — написать падающий тест
  2. Зеленый — написать минимальный код, чтобы тест прошел
  3. Рефакторинг — улучшить код, сохраняя зеленые тесты

Пример TDD для калькулятора:

// 1. Пишем тест (красная фаза)
@Test
void multiply_shouldReturnCorrectResult() {
    Calculator calc = new Calculator();
    assertEquals(6, calc.multiply(2, 3));
    assertEquals(0, calc.multiply(5, 0));
    assertEquals(-10, calc.multiply(2, -5));
}

// 2. Пишем минимальную реализацию (зеленая фаза)
public class Calculator {
    public int multiply(int a, int b) {
        return a * b;
    }
}

// 3. Рефакторинг (если нужно)
// Добавляем проверку переполнения, оптимизацию и т.д.

Тестирование после кода:

// Сначала пишем реализацию
public class UserService {
    public boolean isValidEmail(String email) {
        return email != null && email.contains("@");
    }
}

// Потом пишем тесты
@Test
void isValidEmail_shouldReturnTrueForValidEmail() {
    UserService service = new UserService();
    assertTrue(service.isValidEmail("test@example.com"));
}

Параллельное тестирование:

  • Пишется небольшой кусок кода → сразу тесты для него
  • Итеративный процесс, но без строгого следования TDD

Сравнение подходов:

Критерий TDD После кода Параллельно
Качество дизайна Высокое (тестируемость заложена) Низкое (может быть сложно тестировать) Среднее
Покрытие тестами Полное (тесты для всей функциональности) Могут быть пропущены edge cases Зависит от дисциплины
Скорость разработки Медленнее вначале, быстрее в долгосрочной Быстрее вначале, проблемы позже Средняя
Рефакторинг Безопасный (есть тесты) Рискованный Умеренно безопасный

Рекомендации:

  • Используйте TDD для сложной бизнес-логики
  • Параллельное тестирование подходит для CRUD-операций
  • Тестирование после кода допустимо только для прототипов

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

  • Более чистый и модульный код
  • Лучшее покрытие тестами
  • Уверенность при рефакторинге
  • Документация в виде тестов