Non sono chiaro come TDD, la metodologia, gestisca il caso seguente. Supponiamo che io voglia implementare l'algoritmo di fusione, in Python. Comincio scrivendo
assert mergesort([]) === []
e il test fallisce con
NameError: il nome 'mergesort' non è definito
Aggiungo quindi
def mergesort(a):
return []
e il mio test ha superato. Quindi aggiungo
assert mergesort[5] == 5
e il mio test fallisce con
AssertionError
con cui faccio passare
def mergesort(a):
if not a:
return []
else:
return a
Successivamente, aggiungo
assert mergesort([10, 30, 20]) == [10, 20, 30]
e ora devo provare a fare questo passaggio. "Conosco" l'algoritmo di fusione e quindi scrivo:
def mergesort(a):
if not a:
return []
else:
left, right = a[:len(a)//2], a[len(a)//2:]
return merge(mergesort(left)), mergesort(right))
E questo fallisce
NameError: il nome 'merge' non è definito
Ora ecco la domanda. Come posso scappare e iniziare a implementare merge
usando TDD? Sembra che non posso perché ho questo "appeso" non completato, test fallito mergesort
, che non passerà fino al merge
termine! Se questo test si blocca, non potrò mai davvero fare TDD perché non sarò "verde" durante la costruzione delle iterazioni TDD merge
.
Mi sembra di essere bloccato con i seguenti tre brutti scenari e vorrei sapere (1) quale di questi preferisce la comunità TDD o (2) c'è un altro approccio che mi manca? Ho visto diverse procedure guidate sullo Zio Bob TDD e non ricordo di aver mai visto un caso come questo prima d'ora!
Ecco i 3 casi:
- Implementare l'unione in una directory diversa con una suite di test diversa.
- Non preoccuparti di essere ecologico quando sviluppi la funzione di aiuto, tieni traccia manualmente dei test che vuoi davvero superare.
- Commenta (GASP!) O elimina le linee in
mergesort
quella chiamatamerge
; poi dopo aver iniziatomerge
a lavorare, rimetterli dentro.
Mi sembrano tutti sciocchi (o sto guardando questo male?). Qualcuno conosce l'approccio preferito?
mergesort
. Se stai cercando il modo "giusto" per farlo, non ce n'è uno, se non quello di essere accurati sulla mappatura mergesort
dell'algoritmo su una serie di test unitari; cioè dovrebbero riflettere ciò mergesort
che fa realmente.
mergesort
progetto emerga naturalmente dal rifrattore rosso-verde, ciò non accadrà se non guidi il processo in base alle tue conoscenze esistenti mergesort
.
merge
deve essere inventato solo sul palco "refactoring". Se vedi che il merge
metodo può essere introdotto per superare il test, mergesort
fai prima passare i test senza merge
metodo. Quindi riformattare l'implementazione introducendo il merge
metodo.
mergesort
, poiché è già un algoritmo molto ben definito, questo processo di scoperta non è necessario e diventa quindi una questione di mappatura di ciò che già sai essere il progetto a una serie di test unitari. Presumibilmente, il test di livello superiore afferma che il metodo in esame accetta una raccolta non ordinata e ne restituisce una ordinata ...