Skip to content
IRC-CodingIRC-Coding
TDDTest Driven DevelopmentRed Green RefactorUnit TestsAgile DevelopmentClean Code

Test Driven Development: Red-Green-Refactor

Изучите TDD с циклом Red-Green-Refactor. Преимущества, вызовы, лучшие практики и примеры.

S

schutzgeist

4 min read
Test Driven Development: Red-Green-Refactor

Test Driven Development: Red-Green-Refactor

Test Driven Development, или TDD, это методология разработки, при которой тесты пишут до написания кода. Знаменитый цикл Red-Green-Refactor заставляет разработчика ясно представить желаемое поведение ещё до реализации. Результат обычно более чистый, лучше тестируемый и целенаправленный код.

Суть в двух словах

  • TDD предполагает написание тестов до кода.
  • Цикл состоит из трёх фаз: Red, Green и Refactor.
  • Red: пишешь тест, который падает.
  • Green: минимальный код для прохождения теста.
  • Refactor: улучшаешь код, не меняя поведение.
  • TDD способствует маленьким шагам, ясным требованиям и тестируемому коду.

Краткое определение

TDD переворачивает традиционный порядок. Вместо того чтобы сначала написать код и потом добавить тесты, разработчик начинает с падающего теста. Этот тест описывает нужное поведение. Затем пишут минимальный код, который удовлетворяет тесту. В конце код приводят в порядок, не нарушая тесты.

Цикл Red-Green-Refactor

Red

Напиши тест для функции, которая ещё не реализована. Запусти тест. Он должен провалиться, иначе тест бесполезен.

Green

Напиши минимум кода, необходимый для прохождения теста. На этом этапе красота не важна, цель просто получить зелёный результат.

Refactor

Очисти код, удали дублирование, улучши имена и структуру. Все тесты должны остаться зелёными.

Best Practices

  • Маленькие шаги: каждый цикл должен занимать несколько минут.
  • Фокус на поведении: тесты описывают, что делает софт, а не как это происходит внутри.
  • Никакого лишнего кода: пиши только то, что нужно для прохождения теста.
  • Не пропускай рефакторинг: третий шаг критичен для чистого кода.
  • Хранимость тестов: тесты документируют намерение кода.

Практический пример: расчёт скидок с TDD

import unittest
from app.pricing import calculate_discount

class TestDiscount(unittest.TestCase):
    def test_no_discount_below_threshold(self):
        self.assertEqual(calculate_discount(50), 0)

    def test_discount_for_threshold(self):
        self.assertEqual(calculate_discount(100), 10)

    def test_higher_discount_for_large_amount(self):
        self.assertEqual(calculate_discount(200), 20)

if __name__ == '__main__':
    unittest.main()
def calculate_discount(amount):
    if amount >= 200:
        return 20
    if amount >= 100:
        return 10
    return 0

Плюсы и минусы

Плюсы

  • Ясные требования: тесты заставляют определить желаемое поведение.
  • Быстрая обратная связь: ошибки обнаруживаются сразу.
  • Лучшее качество кода: TDD поощряет небольшие, сфокусированные функции.
  • Безопасность при рефакторинге: тесты защищают от регрессий.
  • Живая документация: тесты показывают, как использовать софт.

Минусы

  • Кривая обучения: TDD требует практики и дисциплины.
  • Стартовые затраты: первые шаги требуют больше времени, чем обычное программирование.
  • Подходит не для всего: спайки, прототипы и исследовательская разработка дают меньше выгоды.
  • Неудачные тесты: плохо написанные тесты приводят к плохому дизайну.

Ключевые моменты

  • Определение и цель TDD.
  • Три фазы Red, Green, Refactor.
  • Отличие TDD от обычного тестирования.
  • Достоинства и ограничения TDD.
  • Значение маленьких шагов и рефакторинга.

Типичные вопросы (с кратким ответом)

  1. Что такое TDD? Методология разработки, при которой тесты пишут до написания кода.

  2. Какие три фазы в цикле TDD? Red, Green, Refactor.

  3. Что происходит в фазе Red? Пишется тест, который падает, потому что функция ещё не существует.

  4. Какова цель фазы Green? Минимум кода для прохождения теста.

  5. Какой основной плюс TDD? Быстрая обратная связь и лучшее покрытие тестами благодаря маленьким, сфокусированным шагам.

Основные источники

  1. https://www.agilealliance.org/glossary/tdd/
  2. https://martinfowler.com/bliki/TestDrivenDevelopment.html
  3. https://en.wikipedia.org/wiki/Test-driven_development

Часто задаваемые вопросы

Что означает Red-Green-Refactor?

Red обозначает падающий тест, Green минимальный код для его прохождения, а Refactor очистку без изменения поведения.

Нужно ли при TDD тестировать каждую строку кода?

Нет. TDD стремится определить поведение через тесты, а не слепо покрыть каждую строку. Качество тестов важнее количества.

TDD подходит только для юнит-тестов?

Традиционно TDD начинается с юнит-тестов, но его можно применять к интеграционным или acceptance-тестам, например через ATDD.

Что такое ATDD?

Acceptance Test Driven Development расширяет TDD на acceptance-тесты. Тесты пишут с позиции пользователя или заказчика до реализации.

Как долго должен длиться один цикл TDD?

Идеальный цикл занимает всего несколько минут. Маленькие шаги дают быструю обратную связь и упрощают рефакторинг.

Что будет, если пропустить фазу Refactor?

Код остаётся сыроватым и с временем становится сложнее его поддерживать. Рефакторинг это шаг, обеспечивающий чистоту и долгосрочное качество.

Можно ли внедрить TDD в существующие проекты?

Да, но часто требуется рефакторинг, чтобы сделать существующий код тестируемым. Новые функции и исправления ошибок хорошая отправная точка.

TDD медленнее обычного программирования?

В начале TDD может казаться медленнее. Но на длительной дистанции он снижает стоимость ошибок и ускоряет рефакторинги и расширения.

Что такое TDD anti-pattern?

Типичный anti-pattern это написание тестов после реализации. Также проблематичны чрезмерно детальные моки или слишком большие тесты за один цикл.

Как TDD способствует чистому коду?

TDD заставляет писать тестируемый код, что обычно означает более модульный, слабосвязанный и хорошо названный код.

В чём отличие TDD от BDD?

TDD сосредоточен на технических тестах для разработчика. BDD переводит требования в примеры на бизнес-языке, чтобы объединить разработчиков и бизнес-аналитиков.

Какие языки программирования подходят для TDD?

TDD независим от языка. Особенно популярен в Java, Python, JavaScript, C# и Ruby благодаря хорошим тест-фреймворкам.

С чего начать тестирование с нуля?

Начни с самого простого и центрального поведения. Например, с базового случая или явного случая ошибки, прежде чем переходить к сложным граничным случаям.

Как работать с внешними зависимостями в TDD?

Внешние зависимости заменяют на test doubles вроде moсков, stubs или fakes, чтобы юнит-тест оставался изолированным и быстрым.

Какой частый повод для провала TDD?

Слишком большие шаги, неясные требования и пропуск фазы Refactor часто приводят к разочарованию в TDD и его неустойчивому применению.

Продолжим путь обучения Software Testing

Следующая статья на пути Software Testing посвящена Behavior Driven Development и тому, как BDD улучшает коммуникацию между разработчиками и заинтересованными лицами.

Назад к блогу
Share:

Nächster Artikel in Качество программного обеспечения

Weiterlesen
Тестовая автоматизация и качество: стратегии и инструменты

Похожие статьи