Мені незрозуміло, як 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
, оскільки це вже дуже чітко визначений алгоритм, цей процес виявлення не потрібен, і він потім стає питанням відображення того, що ви вже знаєте, як дизайн на серію одиничних тестів. Імовірно, ваш тест верхнього рівня стверджує, що ваш тестований метод приймає несортовану колекцію та повертає відсортовану ...