TDD non parla di testing, ma di design.
Lungi dal cadere a pezzi con la complessità, eccelle in queste circostanze. Ti guiderà a considerare il problema più grande in parti più piccole, il che porterà a un design migliore.
Non cercare di testare ogni permutazione del tuo algoritmo. Costruisci un test dopo l'altro, scrivi il codice più semplice per fare in modo che il test funzioni, finché non hai le basi coperte. Dovresti vedere cosa intendo per rompere il problema perché sarai incoraggiato a simulare parti del problema mentre collaudi 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 coprono la parte superiore dell'array, la parte inferiore dell'array e ogni sorta di strane combinazioni nel mezzo. Per ognuno, dovremmo costruire una serie completa di un qualche tipo di oggetto. Ciò richiederebbe tempo.
Oppure potremmo affrontare il problema in quattro parti:
- Attraversa l'array.
- Confronta gli elementi selezionati.
- Cambia elementi.
- Coordinare i tre precedenti.
Il primo è 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 tipizzati static ci sarà un'interfaccia per mostrare se tale funzionalità è implementata. Quindi non è necessario testarlo.
Il terzo è incredibilmente facile da testare.
Il quarto tratta solo due puntatori, chiede alla classe trasversale di spostare i puntatori, richiede un confronto e in base al risultato di tale confronto, richiede che gli elementi vengano scambiati. Se hai simulato i primi tre problemi, puoi testarlo molto facilmente.
Come abbiamo portato a un design migliore qui? Diciamo che l'hai mantenuto semplice e implementato un bubble sort. 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 scambiarlo. Non devi affrontare la complessità della gestione degli altri tre problemi.
Questo, troverai, è la differenza tra test unitario e TDD. Il tester dell'unità dirà che questo ha reso i test fragili, che se avessi testato input e output semplici, non avresti ora bisogno di scrivere più test per la tua nuova funzionalità. Il TDDer dirà che ho separato le preoccupazioni opportunamente in modo che ogni classe abbia fatto una cosa e una cosa bene.