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