• Чтобы TDD стало приносить пользу в новом проекте, необходимо приложить немало усилий. Особенно много тратится на интеграционные тесты методом «черного ящика». Но эти усилия окупаются очень быстро.
• Потрать достаточно времени, но сделай так, чтобы писать тесты было просто. То есть надо получить необходимый инструментарий, обучить персонал, обеспечить создание правильных вспомогательных и базовых классов и т. д.
Мы используем следующие инструменты для разработки через тестирование:
• jUnit / httpUnit / jWebUnit. Мы присматриваемся к TestNG и Selenium.
• HSQLDB в качестве встроенной БД в памяти (in-memory) для тестовых целей.
• Jetty в качестве встроенного web-контейнера в памяти (in-memory) для тестовых целей.
• Cobertura для определения степени покрытия кода тестами.
• Spring framework для написания различных типов тестовых фикстур (в т. ч. с использованием моков (mock-object) и без, с внешней БД и БД в памяти (in-memory) и т. д.)
В наших наиболее сложных продуктах (с точки зрения TDD) у нас реализованы автоматизированные приёмочные тесты методом «черного ящика». Эти тесты загружают всю систему в память, включая базы данных и web-сервера, и взаимодействуют с системой только через внешние интерфейсы (например, через
HTTP).
Такой подход позволяет получить быстрые циклы «разработка-сборка-тест». Он так же выступает в качестве страховки, придавая разработчикам уверенность в успешности частого рефакторинга кода. В свою очередь, это обеспечивает простоту и элегантность дизайна даже в случае разрастания системы.
Мы используем TDD для всех новых проектов, даже если это означает, что фаза развёртывания рабочего окружения проекта потребует больше времени (потому что нужно больше усилий на настройку и поддержку тестовых утилит). Нетрудно понять, что выгода перевесит любой предлог не внедрять TDD.
Я уже говорил, что TDD — это непросто, но что действительно сложно, так это пытаться применять TDD для кода, который изначально не был спроектирован для применения этого подхода! Почему? Эту тему можно долго обсуждать, но я, пожалуй, остановлюсь. Приберегу мысли для следующей книги: «TDD: Заметки с передовой»: o)
В своё время мы потратили много времени в попытках автоматизировать интеграционное тестирование одной из сложных систем, код которой мы унаследовали в ужасном состоянии и без единого теста.
При выходе каждого релиза мы выделяли команду тестировщиков, которые выполняли весь набор сложных регрессионных тестов и тестов производительности. Регрессионное тестирование выполнялось преимущественно вручную, что существенно замедляло процессы разработки и выпуска релизов. Тогда нашей целью стало автоматизировать все эти тесты. Однако, побившись пару месяцев головой об стену, мы поняли, что не приблизились к цели ни на йоту.