Ho trovato che TDD si comporta male quando si tratta di sistemi emergenti. Sono uno sviluppatore di videogiochi e recentemente ho utilizzato TDD per creare un sistema che utilizza più comportamenti semplici per creare movimenti dall'aspetto realistico per un'entità.
Ad esempio, ci sono comportamenti responsabili per allontanarti da aree pericolose di diverso tipo e da persone responsabili di spostarti verso aree interessanti di diverso tipo. Amalgamando l'output di ogni comportamento crea un movimento finale.
Le budella del sistema sono state implementate facilmente e TDD è stato utile qui per specificare di cosa dovrebbe essere responsabile ciascun sottosistema.
Tuttavia mi sono imbattuto in problemi quando si trattava di specificare come interagiscono i comportamenti e, ancora più importante, come interagiscono nel tempo. Spesso non c'era una risposta giusta e, sebbene i miei primi test fossero passati, la QA poteva continuare a trovare casi limite in cui il sistema non funzionava. Per trovare la soluzione corretta ho dovuto ripetere iteraggi diversi e, se avessi aggiornato i test ogni volta per riflettere i nuovi comportamenti prima di controllare che funzionassero nel gioco, potrei aver finito per buttare via i test più e più volte. Così ho cancellato quei test.
Avrei dovuto possedere test più potenti che hanno catturato i casi limite scoperti dal QA, ma quando hai un sistema come questo che si trova in cima a molti sistemi fisici e di gameplay, e hai a che fare con comportamenti nel tempo, diventa un po 'un incubo per specificare esattamente cosa sta succedendo.
Quasi certamente ho commesso degli errori nel mio approccio, e come ho detto per il coraggio del sistema TDD ha funzionato brillantemente, e persino supportato alcuni refactoring ottimizzanti.