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

Preview:

DESCRIPTION

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

Citation preview

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 карты