Test-Driven Development (TDD)

Test-Driven Development — это методология разработки программного обеспечения, при которой тесты пишутся перед написанием самого кода.

Цикл Red-Green-Refactor

  1. Red — написать падающий тест
  2. Green — написать минимальный код для прохождения теста
  3. Refactor — улучшить код, сохраняя функциональность

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

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

Пример TDD процесса

 1// 1. RED - пишем падающий тест
 2test('should calculate sum of two numbers', () => {
 3  expect(add(2, 3)).toBe(5);
 4});
 5
 6// 2. GREEN - минимальная реализация
 7function add(a, b) {
 8  return 5; // жестко закодированное решение
 9}
10
11// 3. GREEN - более общая реализация
12function add(a, b) {
13  return a + b;
14}
15
16// 4. REFACTOR - улучшаем код (если нужно)
17const add = (a, b) => a + b;

Пример TDD на Python

 1# Установка pytest
 2pip install pytest
 3# или
 4poetry add pytest
 5
 6# test_calculator.py - сначала тест
 7def test_add_two_numbers():
 8    assert add(2, 3) == 5
 9
10# calculator.py - затем реализация
11def add(a, b):
12    return a + b
13
14# Запуск тестов
15pytest test_calculator.py

Типы тестов в TDD

  • Unit tests — тестирование отдельных функций/классов
  • Integration tests — тестирование взаимодействий
  • Acceptance tests — тестирование пользовательских сценариев

Best practices TDD

  • Маленькие шаги — делайте небольшие изменения
  • Один тест за раз — фокусируйтесь на одном тесте
  • Быстрые тесты — тесты должны выполняться быстро
  • Изолированные тесты — каждый тест независим
  • Описательные имена — понятные названия тестов

Проблемы TDD

  • Увеличение времени разработки в начале
  • Сложность с legacy кодом
  • Требует дисциплины от команды
  • Может привести к over-testing

TDD инструменты для разных языков

  • Python — pytest, unittest
  • JavaScript — Jest, Mocha, Jasmine
  • Java — JUnit, TestNG
  • C# — NUnit, xUnit
  • Ruby — RSpec, Minitest

FAQ

Всегда ли нужно использовать TDD?

TDD особенно полезен для сложной бизнес-логики. Для простых задач или прототипов может быть избыточным.

Как начать применять TDD в существующем проекте?

Начните с новых функций или при рефакторинге существующего кода. Постепенно увеличивайте покрытие тестами.