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 mergeusando TDD? Sembra che non posso perché ho questo "appeso" non completato, test fallito mergesort, che non passerà fino al mergetermine! 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
mergesortquella chiamatamerge; poi dopo aver iniziatomergea 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 mergesortdell'algoritmo su una serie di test unitari; cioè dovrebbero riflettere ciò mergesortche fa realmente.
mergesortprogetto emerga naturalmente dal rifrattore rosso-verde, ciò non accadrà se non guidi il processo in base alle tue conoscenze esistenti mergesort.
mergedeve essere inventato solo sul palco "refactoring". Se vedi che il mergemetodo può essere introdotto per superare il test, mergesortfai prima passare i test senza mergemetodo. Quindi riformattare l'implementazione introducendo il mergemetodo.
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 ...