Nie jestem pewien, w jaki sposób TDD, metodologia, obsługuje następujący przypadek. Załóżmy, że chcę zaimplementować algorytm scalania w Pythonie. Zaczynam od pisania
assert mergesort([]) === []
a test kończy się niepowodzeniem
Nazwa Błąd: nazwa „scalanie” nie jest zdefiniowana
Następnie dodaję
def mergesort(a):
return []
i mój test mija. Następnie dodaję
assert mergesort[5] == 5
i mój test kończy się niepowodzeniem
AssertionError
które przekazuję
def mergesort(a):
if not a:
return []
else:
return a
Następnie dodaję
assert mergesort([10, 30, 20]) == [10, 20, 30]
i teraz muszę spróbować to przekazać. „Znam” algorytm scalania, więc piszę:
def mergesort(a):
if not a:
return []
else:
left, right = a[:len(a)//2], a[len(a)//2:]
return merge(mergesort(left)), mergesort(right))
I to się nie udaje
NameError: nazwa „merge” nie jest zdefiniowana
Oto pytanie. Jak mogę uciec i zacząć wdrażać mergeza pomocą TDD? Wygląda na to, że nie mogę, bo mam ten „wiszący” niespełniony, nieudany test mergesort, który nie przejdzie, dopóki się mergenie skończy! Jeśli ten test się zawiesi, nigdy tak naprawdę nie będę mógł wykonywać TDD, ponieważ nie będę „zielony” podczas konstruowania iteracji TDD merge.
Wygląda na to, że utknąłem w poniższych trzech brzydkich scenariuszach i chciałbym wiedzieć (1), który z nich preferuje społeczność TDD, lub (2) czy istnieje inne podejście, którego mi brakuje? Obejrzałem kilka instrukcji wujka Boba TDD i nie przypominam sobie, aby widziałem wcześniej taki przypadek!
Oto 3 przypadki:
- Zaimplementuj scalanie w innym katalogu z innym pakietem testowym.
- Nie martw się, że jesteś zielony podczas opracowywania funkcji pomocnika, po prostu ręcznie śledź, które testy naprawdę chcesz zdać.
- Skomentuj (GASP!) Lub usuń linie w
mergesorttym połączeniumerge; następnie pomergepowrocie do pracy włóż je z powrotem.
Wszystko to wygląda dla mnie głupio (a może patrzę na to źle?). Czy ktoś zna preferowane podejście?
mergesort. Jeśli szukasz „właściwego” sposobu na zrobienie tego, nie ma innego, niż być dokładnym w kwestii mapowania mergesortalgorytmu na serię testów jednostkowych; tzn. powinny odzwierciedlać to, co mergesortfaktycznie robi.
mergesortprojekt wyłoni się naturalnie z refaktora czerwono-zielonego, nie stanie się to, dopóki nie pokierujesz procesem w oparciu o twoją wiedzę mergesort.
mergemusi być wynaleziony tylko na etapie „refaktoryzacji”. Jeśli zauważysz, że mergemetoda ta może zostać wprowadzona do zaliczenia testu mergesort, najpierw wykonaj testy bez mergemetody. Następnie refaktoryzuj swoją implementację, wprowadzając mergemetodę.
mergesort, ponieważ jest to już bardzo dobrze zdefiniowany algorytm, ten proces wykrywania nie jest wymagany, a następnie staje się kwestią odwzorowania tego, co już wiesz, że jest projektem, na serię testów jednostkowych. Prawdopodobnie w teście najwyższego poziomu potwierdzono, że testowana metoda akceptuje nieposortowane zbiory i zwraca posortowane ...