Dall'esperienza:
TDD non porta necessariamente a un buon design. È possibile e davvero facile ottenere un programma mal progettato usando TDD.
TDD è solo uno strumento per aiutarci a progettare più rapidamente utilizzando il refactoring , non farà mai apparire magicamente il design del programma. TDD è uno strumento di aiuto alla progettazione. La qualità del design che otterrete da TDD dipende in gran parte dalla capacità dello sviluppatore di utilizzare il refactoring per progettare modelli o di rifattorizzare i principi SOLID.
Lo sviluppatore farà emergere il progetto usando il refactoring continuo. È l'aspetto più importante di TDD: Refactoring .
Applicare il TDD senza fare refactoring costante porterà spesso a sistemi progettati in modo scadente, il che è peggio dell'applicazione del BDUF.
Il TDD è spesso associato alla nozione di " design emergente ". In modo agile, spesso crei il tuo software in modo incrementale, funzione per caratteristica. Quindi non puoi sapere fin dall'inizio quale architettura ti servirà, si evolverà / emergerà con il tempo. Quindi ogni volta che aggiungi una nuova funzionalità, esegui dei refactoring per migliorare il design della tua applicazione. È un design continuo / incrementale. Ecco perché TDD è la chiave di un processo agile.
BDUF non è incompatibile con TDD. Non c'è niente di sbagliato nell'iniziare un pezzo di software avendo già in mente il design. TDD ti consentirà quindi di implementare rapidamente il progetto. E nel caso in cui il progetto che hai pensato fosse sbagliato, TDD ti permetterà di effettuare il refactoring in modo corretto e sicuro. Ancora una volta, è solo uno strumento, è lì per aiutarci a sviluppare le nostre idee più velocemente e progettare roba in modo sicuro e veloce.
Quindi puoi fare BDUF + TDD o Emergent Design + TDD, più tardi è il più comune nella comunità agile a causa del modo iterativo di lavorare.
In tutti i casi non dovresti mai provare a fare progetti emergenti senza essere disposti a fare un costante refactoring, entrambi vanno insieme e richiede davvero molta disciplina. Le cose possono rapidamente fuori controllo se continui ad aggiungere nuove funzionalità senza applicare Refactoring.
Il refactoring si applica sia al codice di produzione che al codice di test.
Un interessante articolo da leggere per ottenere maggiori informazioni sulla domanda può essere trovato qui:
Apprendimento dai risolutori di Sudoku