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

36
Test Driven Development Anton Katkov

description

материал с конференции http://camp.agiledays.ru

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

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

Test Driven Development

Anton Katkov

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

Как прийти к TDD?

• Если тесты – это хорошо, то почему бы не создавать их для всего кода?

• Тесты, как спецификация• TDD - это принцип «разделяй и властвуй»

для получения «чистого кода, который работает»

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

Алгоритм

1. Быстро создать новый тест2. Запустить все тесты и обнаружить, что новый тест

не проходит3. Внести небольшие изменения в код4. Снова запустить все тесты и на этот раз

зафиксировать, что все они успешно срабатывают5. Провести рефакторинг для устранения

дублирования6. Goto 1

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

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

• Никогда не нарушайте последовательность шагов• Начинайте с малого• Не бойтесь ошибиться (Courage)• Не беритесь за все подзадачи сразу. Вместо этого

выписывайте каждую подзадачу на лист бумаги и беритесь в один момент времени только за один листочек.

• Выбирайте те подзадачи, которые дадут вам наиболее полезную информацию

• «Не прерывайте прерывание»

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

RED-GREEN-REFACTOR МАНТРА

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

Этапы цикла

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

Red

• Напишите небольшой тест, который не работает или даже не компилируется

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

Green

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

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

Рефакторинг

• Удалите из написанного кода любое дублирование, получив чистый код

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

НАПИСАНИЕ ТЕСТА

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

Принцип “тестируйте”

Экстремальное программирование - разработка через тестирование Кент Бек

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

Принцип: Assert First

• Начните тест с написания того, что вы хотите проверить, то есть с assert

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

Значения для тестов

• Тестовые данные должны быть как можно проще, но информативными

• Реалистичные данные:– Тестирование систем реального времени с

использованием цепочек реальных событий– Сравнение поведения старой и новой системы– Проверка неизменности поведения кода

имитирующего реальный процесс после рефакторинга

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

Принцип: Понятные данные

Экстремальное программирование - разработка через тестирование Кент Бек

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

Принцип: Понятные данные

Экстремальное программирование - разработка через тестирование Кент Бек

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

RED

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

Принцип: One Step Test

• Есть список задач – Tests List• С какого теста начать?

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

Принцип: Starter Test

• Начните с теста, который ничего не делает• Ответьте на вопрос, где должна

располагаться операция

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

Принцип: Explanation Test

• Для любого объяснения используйте тесты• Это способ распространения TDD в команде

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

Принцип: Learning Test

• Способ проверить догадки о том, как себя ведёт библиотека

• Возможность быстро проверять совместимость при выходе новых версий

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

Принцип: Another Test

• Когда возникает интересная посторонняя мысль, то запишите её в список и отложите

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

Принцип: Regression Test

• Что необходимо сделать первым после того, как был обнаружен баг?

• Конечно же написать тест!

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

Принципы эффективности

• Перерыв (break)

• Начать сначала (do over)

Экстремальное программирование - разработка через тестирование Кент Бек

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

Паттерн: Самошунтирование (Self Shunt)

• Каким образом убедиться, что ваш объект корректно взаимодействует с другим?

• Заставьте объект взаимодействовать не с целевым объектом, а с вашим тестом

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

Паттерн: Broken Test

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

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

GREEN

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

Приёмы быстрого получения зелёной полосы

• Подделай это (Fake It)• Триангуляция (Triangulation)• Очевидная реализация (Obvious

Implementation)• От одного ко многим (One to Many)

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

Приём Fake It

• Сделайте так, чтобы тестируемый код возвращал такую константу, что тест станет зелёным

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

Приём Triangulation

• Выставляйте ограничения в тестах• Постепенно увеличивайте абстрактность в

коде• Используем, если не уверены в том, какая

абстракция будет корректной

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

Приём Obvious Implementation

• Является большим шагом, то есть увеличивает темп

• Поэтому использование рискованно

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

Темп

• Если вы уверены, то можно двигаться большими шагами

• Если вы ошибаетесь, то надо вернуться на шаг назад и снизить темп

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

РЕФАКТОРИНГ

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

Правила

• Получите чистый код• После каждого изменения запускайте тесты• Подробнее об этом в презентации

«Refactoring»

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

ЗАКЛЮЧЕНИЕ

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

Необходимые навыки

• Владение Fake It, Triangulation & Obvious Implementation

• Умение удалять дублирование логики между кодом и тестами

• Способность контролировать скорость

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

TDD и архитектура

• Этап рефакторинга позволяет нам получать хорошую архитектуру

• Получаем Simple Design• Необходимо стратегическое видение

архитектуры. Для его получения можно использовать, например, CRC карты