TDD non riguarda i test, riguarda il design.
Lungi dal cadere a pezzi con la complessità, eccelle in queste circostanze. Ti spingerà a considerare il problema più grande in pezzi più piccoli, che porterà a un design migliore.
Non cercare di provare ogni permutazione del tuo algoritmo. Crea test dopo test, scrivi il codice più semplice per far funzionare il test, fino a quando non avrai coperto le tue basi. Dovresti vedere cosa intendo per risolvere il problema perché sarai incoraggiato a falsificare parti del problema durante il test di altre parti, per evitare di dover scrivere 10 miliardi di test per 10 miliardi di permutazioni.
Modifica: volevo aggiungere un esempio, ma non avevo tempo prima.
Consideriamo un algoritmo di ordinamento sul posto. Potremmo andare avanti e scrivere test che coprano l'estremità superiore dell'array, l'estremità inferiore dell'array e ogni sorta di strane combinazioni nel mezzo. Per ognuno, dovremmo costruire un array completo di qualche tipo di oggetto. Ciò richiederebbe tempo.
Oppure potremmo affrontare il problema in quattro parti:
- Attraversa l'array.
- Confronta gli articoli selezionati.
- Cambia elementi.
- Coordinare i tre precedenti.
La prima è l'unica parte complicata del problema, ma estraendolo dal resto, lo hai reso molto, molto più semplice.
Il secondo è quasi certamente gestito dall'oggetto stesso, almeno facoltativamente, in molti framework di tipo statico ci sarà un'interfaccia per mostrare se tale funzionalità è implementata. Quindi non è necessario testarlo.
Il terzo è incredibilmente facile da testare.
Il quarto gestisce solo due puntatori, chiede alla classe di attraversamento di spostare i puntatori in giro, chiede un confronto e in base al risultato di tale confronto, chiede che gli elementi vengano scambiati. Se hai risolto i primi tre problemi, puoi provarlo molto facilmente.
Come abbiamo portato a un design migliore qui? Supponiamo che tu l'abbia reso semplice e abbia implementato una sorta di bolla. Funziona ma, quando vai in produzione e deve gestire un milione di oggetti, è troppo lento. Tutto quello che devi fare è scrivere nuove funzionalità di attraversamento e scambiarle. Non devi fare i conti con la complessità della gestione degli altri tre problemi.
Questa, troverete, è la differenza tra test unitari e TDD. Il tester dell'unità dirà che ciò ha reso fragili i test, che se avessi testato input e output semplici, non dovresti ora scrivere altri test per la tua nuova funzionalità. Il TDDer dirà che ho separato le preoccupazioni in modo adeguato in modo che ogni classe che ho faccia una cosa e una cosa bene.