понедельник, 22 апреля 2013 г.

Как генерировать тест-кейсы в TDD

Интересную тему поднял СанЁк с Виталиком на недавнем тренинге Coding Dojo.

Есть пара программистов, работают по TDD, реализуют фичу. Вроде и тесты зелёные, и простая реализации кода. Но что-то беспокоит - ощущение, что что-то не сделано. Как же создать новые тесты, и чтобы красные они были?...

По идее напарник должен был бы помочь. Но может случиться что у пары нет идей?

Позвать третьего? Тоже вариант. Но тогда ему надо вникнуть в таск хорошенько) желательно с предысторией. Подвариант: ничего ему не рассказывать, только дать условия задачи и код с тестами. Пусть сам разберётся, без тех констрейнтов которые у пары уже сформировались и которые возможно мешают увидеть картинку с высоты птичьего полёта.

Сделать перерыв и вернуться к этому позже? Вполне может быть... У меня по дороге домой столько идей роилось по поводу того как можно улучшить мой алгоритм игры в бомбермена и даже баги мысленно нашёл) Но что сделать, если таск надо сделать здесь и сейчас и значит перерыв не покатит?

5 минут по-любому надо выкроить. И отойти от компа подальше...

А может удалить парочку тестов (или все)? Вдруг их наличие давит на подсознание и мешает генерировать что-то новое?

Пойти в крайности? Попытаться понять что является крайним случаем для этой задачи. А может "крайность" эта относительная, зависит не от задачи, а от текущей реализации? Т.е. попытаться почувствовать для каких диапазонов входных эта реализация рулит, а для каких чувствуется, что не будет работать.

Задокументировать реализацию, не меняя сам код. Например отжавадокировать/прокомментировать свою реализацию. Вот представь что тесты твои читать никто не будет. Объясни читателю кода почему твои магические 3 и 5 будут работать хорошо для этой задачи.

Отрефакторить реализацию. Магию констант обозвать... Даже переменные переименовать. Повыносить методы итд. Что угодно чтобы реализация преобразилась и можно было взглянуть на неё под другим углом.

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