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