Test Driven Development

Anton Katkov
Как прийти к TDD?
• Если тесты – это хорошо, то почему бы не
  создавать их для всего кода?
• Тесты, как спецификация
• TDD - это принцип «разделяй и властвуй»
  для получения «чистого кода, который
  работает»
Алгоритм
1. Быстро создать новый тест
2. Запустить все тесты и обнаружить, что новый
   тест не проходит
3. Внести небольшие изменения в код
4. Снова запустить все тесты и на этот раз
   зафиксировать, что все они успешно
   срабатывают
5. Провести рефакторинг для устранения
   дублирования
6. Goto 1
Рекомендации
• Никогда не нарушайте последовательность шагов
• Начинайте с малого
• Не бойтесь ошибиться (Courage)
• Не беритесь за все подзадачи сразу. Вместо этого
  выписывайте каждую подзадачу на лист бумаги и
  беритесь в один момент времени только за один
  листочек.
• Выбирайте те подзадачи, которые дадут вам
  наиболее полезную информацию
• «Не прерывайте прерывание»
RED-GREEN-REFACTOR МАНТРА
Этапы цикла
Red
• Напишите небольшой тест, который не
  работает или даже не компилируется
Green
• Заставьте тест работать как можно
  быстрее, не задумываясь при этом о
  правильности дизайна и чистоте кода.
  Напишите минимум, который необходим
  для получения зелёной полосы.
Рефакторинг
• Удалите из написанного кода любое
  дублирование, получив чистый код
НАПИСАНИЕ ТЕСТА
Принцип “тестируйте”




Экстремальное программирование - разработка через тестирование
Кент Бек
Принцип: Assert First
• Начните тест с написания того, что вы
  хотите проверить, то есть с assert
Значения для тестов
• Тестовые данные должны быть как можно
  проще, но информативными
• Реалистичные данные:
  – Тестирование систем реального времени с
    использованием цепочек реальных событий
  – Сравнение поведения старой и новой системы
  – Проверка неизменности поведения кода
    имитирующего реальный процесс после
    рефакторинга
Принцип: Понятные данные




Экстремальное программирование - разработка через тестирование
Кент Бек
Принцип: Понятные данные




Экстремальное программирование - разработка через тестирование
Кент Бек
RED
Принцип: One Step Test
• Есть список задач – Tests List
• С какого теста начать?
Принцип: Starter Test
• Начните с теста, который ничего не делает
• Ответьте на вопрос, где должна
  располагаться операция
Принцип: Explanation Test
• Для любого объяснения используйте тесты
• Это способ распространения TDD в команде
Принцип: Learning Test
• Способ проверить догадки о том, как себя
  ведёт библиотека
• Возможность быстро проверять
  совместимость при выходе новых версий
Принцип: Another Test
• Когда возникает интересная посторонняя
  мысль, то запишите её в список и отложите
Принцип: Regression Test
• Что необходимо сделать первым после
  того, как был обнаружен баг?
• Конечно же написать тест!
Принципы эффективности
• Перерыв (break)




• Начать сначала (do over)
Экстремальное программирование - разработка через тестирование
Кент Бек
Паттерн: Самошунтирование (Self Shunt)

• Каким образом убедиться, что ваш объект
  корректно взаимодействует с другим?
• Заставьте объект взаимодействовать не с
  целевым объектом, а с вашим тестом
Паттерн: Broken Test

• В конце работы оставьте последний тест
  сломанным, чтобы затем с него и начать
  работу после перерыва
GREEN
Приёмы быстрого получения зелёной полосы

• Подделай это (Fake It)
• Триангуляция (Triangulation)
• Очевидная реализация (Obvious
  Implementation)
• От одного ко многим (One to Many)
Приём Fake It
• Сделайте так, чтобы тестируемый код
  возвращал такую константу, что тест станет
  зелёным
Приём Triangulation
• Выставляйте ограничения в тестах
• Постепенно увеличивайте абстрактность в
  коде
• Используем, если не уверены в том, какая
  абстракция будет корректной
Приём Obvious Implementation
• Является большим шагом, то есть
  увеличивает темп
• Поэтому использование рискованно
Темп
• Если вы уверены, то можно двигаться
  большими шагами
• Если вы ошибаетесь, то надо вернуться на
  шаг назад и снизить темп
РЕФАКТОРИНГ
Правила
• Получите чистый код
• После каждого изменения запускайте тесты
• Подробнее об этом в презентации
  «Refactoring»
ЗАКЛЮЧЕНИЕ
Необходимые навыки
• Владение Fake It, Triangulation & Obvious
  Implementation
• Умение удалять дублирование логики
  между кодом и тестами
• Способность контролировать скорость
TDD и архитектура
• Этап рефакторинга позволяет нам получать
  хорошую архитектуру
• Получаем Simple Design
• Необходимо стратегическое видение
  архитектуры. Для его получения можно
  использовать, например, CRC карты

AgileCamp’11 Новосибирск - Test Driven Development (TDD)

  • 1.
  • 2.
    Как прийти кTDD? • Если тесты – это хорошо, то почему бы не создавать их для всего кода? • Тесты, как спецификация • TDD - это принцип «разделяй и властвуй» для получения «чистого кода, который работает»
  • 3.
    Алгоритм 1. Быстро создатьновый тест 2. Запустить все тесты и обнаружить, что новый тест не проходит 3. Внести небольшие изменения в код 4. Снова запустить все тесты и на этот раз зафиксировать, что все они успешно срабатывают 5. Провести рефакторинг для устранения дублирования 6. Goto 1
  • 4.
    Рекомендации • Никогда ненарушайте последовательность шагов • Начинайте с малого • Не бойтесь ошибиться (Courage) • Не беритесь за все подзадачи сразу. Вместо этого выписывайте каждую подзадачу на лист бумаги и беритесь в один момент времени только за один листочек. • Выбирайте те подзадачи, которые дадут вам наиболее полезную информацию • «Не прерывайте прерывание»
  • 5.
  • 6.
  • 7.
    Red • Напишите небольшойтест, который не работает или даже не компилируется
  • 8.
    Green • Заставьте тестработать как можно быстрее, не задумываясь при этом о правильности дизайна и чистоте кода. Напишите минимум, который необходим для получения зелёной полосы.
  • 9.
    Рефакторинг • Удалите изнаписанного кода любое дублирование, получив чистый код
  • 10.
  • 11.
    Принцип “тестируйте” Экстремальное программирование- разработка через тестирование Кент Бек
  • 12.
    Принцип: Assert First •Начните тест с написания того, что вы хотите проверить, то есть с assert
  • 13.
    Значения для тестов •Тестовые данные должны быть как можно проще, но информативными • Реалистичные данные: – Тестирование систем реального времени с использованием цепочек реальных событий – Сравнение поведения старой и новой системы – Проверка неизменности поведения кода имитирующего реальный процесс после рефакторинга
  • 14.
    Принцип: Понятные данные Экстремальноепрограммирование - разработка через тестирование Кент Бек
  • 15.
    Принцип: Понятные данные Экстремальноепрограммирование - разработка через тестирование Кент Бек
  • 16.
  • 17.
    Принцип: One StepTest • Есть список задач – Tests List • С какого теста начать?
  • 18.
    Принцип: Starter Test •Начните с теста, который ничего не делает • Ответьте на вопрос, где должна располагаться операция
  • 19.
    Принцип: Explanation Test •Для любого объяснения используйте тесты • Это способ распространения TDD в команде
  • 20.
    Принцип: Learning Test •Способ проверить догадки о том, как себя ведёт библиотека • Возможность быстро проверять совместимость при выходе новых версий
  • 21.
    Принцип: Another Test •Когда возникает интересная посторонняя мысль, то запишите её в список и отложите
  • 22.
    Принцип: Regression Test •Что необходимо сделать первым после того, как был обнаружен баг? • Конечно же написать тест!
  • 23.
    Принципы эффективности • Перерыв(break) • Начать сначала (do over) Экстремальное программирование - разработка через тестирование Кент Бек
  • 24.
    Паттерн: Самошунтирование (SelfShunt) • Каким образом убедиться, что ваш объект корректно взаимодействует с другим? • Заставьте объект взаимодействовать не с целевым объектом, а с вашим тестом
  • 25.
    Паттерн: Broken Test •В конце работы оставьте последний тест сломанным, чтобы затем с него и начать работу после перерыва
  • 26.
  • 27.
    Приёмы быстрого получениязелёной полосы • Подделай это (Fake It) • Триангуляция (Triangulation) • Очевидная реализация (Obvious Implementation) • От одного ко многим (One to Many)
  • 28.
    Приём Fake It •Сделайте так, чтобы тестируемый код возвращал такую константу, что тест станет зелёным
  • 29.
    Приём Triangulation • Выставляйтеограничения в тестах • Постепенно увеличивайте абстрактность в коде • Используем, если не уверены в том, какая абстракция будет корректной
  • 30.
    Приём Obvious Implementation •Является большим шагом, то есть увеличивает темп • Поэтому использование рискованно
  • 31.
    Темп • Если выуверены, то можно двигаться большими шагами • Если вы ошибаетесь, то надо вернуться на шаг назад и снизить темп
  • 32.
  • 33.
    Правила • Получите чистыйкод • После каждого изменения запускайте тесты • Подробнее об этом в презентации «Refactoring»
  • 34.
  • 35.
    Необходимые навыки • ВладениеFake It, Triangulation & Obvious Implementation • Умение удалять дублирование логики между кодом и тестами • Способность контролировать скорость
  • 36.
    TDD и архитектура •Этап рефакторинга позволяет нам получать хорошую архитектуру • Получаем Simple Design • Необходимо стратегическое видение архитектуры. Для его получения можно использовать, например, CRC карты