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ć merge
za 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ę merge
nie 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
mergesort
tym połączeniumerge
; następnie pomerge
powrocie 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 mergesort
algorytmu na serię testów jednostkowych; tzn. powinny odzwierciedlać to, co mergesort
faktycznie robi.
mergesort
projekt wyłoni się naturalnie z refaktora czerwono-zielonego, nie stanie się to, dopóki nie pokierujesz procesem w oparciu o twoją wiedzę mergesort
.
merge
musi być wynaleziony tylko na etapie „refaktoryzacji”. Jeśli zauważysz, że merge
metoda ta może zostać wprowadzona do zaliczenia testu mergesort
, najpierw wykonaj testy bez merge
metody. Następnie refaktoryzuj swoją implementację, wprowadzając merge
metodę.
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 ...