Мені незрозуміло, як TDD, методологія, розглядає такий випадок. Припустимо, я хочу реалізувати алгоритм злиття в Python. Починаю писати
assert mergesort([]) === []
і тест не вдається
NameError: назва 'mergesort' не визначено
Потім додаю
def mergesort(a):
return []
і мій тест проходить. Далі додаю
assert mergesort[5] == 5
і мій тест не вдається
AssertionError
з яким я проходжу
def mergesort(a):
if not a:
return []
else:
return a
Далі додаю
assert mergesort([10, 30, 20]) == [10, 20, 30]
і мені зараз потрібно спробувати зробити цей прохід. Я "знаю" алгоритм злиття, тому пишу:
def mergesort(a):
if not a:
return []
else:
left, right = a[:len(a)//2], a[len(a)//2:]
return merge(mergesort(left)), mergesort(right))
І це не вдається
NameError: ім'я "злиття" не визначено
Тепер ось питання. Як я можу закінчитись та почати впроваджувати mergeвикористання TDD? Здається, я не можу, тому що у мене це "висяче" невиконане, невдале тест mergesort, яке не пройде, поки не mergeбуде закінчено! Якщо цей тест зависає, я ніколи не можу робити TDD, тому що я не буду "зеленим" під час створення своїх ітерацій TDD merge.
Схоже, я застряг у наступних трьох потворних сценаріях, і хотів би знати (1), якому з них надає перевагу спільнота TDD, або (2) чи є інший підхід, який я мені не вистачає? Я спостерігав кілька покрокових інструкцій дядька Боба TDD і не згадую, як раніше бачив такий випадок!
Ось 3 випадки:
- Реалізуйте об'єднання в інший каталог з іншим тестовим набором.
- Не турбуйтеся про те, що ви розробляєте функцію помічника зеленого кольору, просто вручну слідкуйте, які тести ви дійсно хочете пройти.
- Коментуйте (GASP!) Або видаляйте рядки в
mergesortцьому дзвінкуmerge; після того, як приступитиmergeдо роботи, покладіть їх назад.
Усі вони виглядають на мене дурними (чи я дивлюсь на це неправильно?). Хтось знає кращий підхід?
mergesort. Якщо ви шукаєте "правильний" спосіб зробити це, не існує жодного іншого, крім того, щоб бути точним щодо вашого відображення mergesortалгоритму на ряд одиничних тестів; тобто вони повинні відображати те, що mergesortнасправді робить.
mergesortдизайн природним чином вийде з червоно-зеленого рефактора, це не відбудеться, якщо ви не керуєте процесом на основі наявних знань mergesort.
mergeпотрібно вигадувати лише на етапі "рефакторингу". Якщо ви бачите, що mergeметод може бути запроваджений для проходження тестування, mergesortви спершу зробите тести без mergeметоду. Потім рефакторинг вашої реалізації, ввівши mergeметод.
mergesort, оскільки це вже дуже чітко визначений алгоритм, цей процес виявлення не потрібен, і він потім стає питанням відображення того, що ви вже знаєте, як дизайн на серію одиничних тестів. Імовірно, ваш тест верхнього рівня стверджує, що ваш тестований метод приймає несортовану колекцію та повертає відсортовану ...