Descubrí que TDD funciona mal cuando se trata de sistemas emergentes. Soy un desarrollador de videojuegos, y recientemente usé TDD para crear un sistema que usa múltiples comportamientos simples para crear un movimiento de aspecto realista para una entidad.
Por ejemplo, hay comportamientos responsables de alejarlo de áreas peligrosas de diferentes tipos, y otros responsables de moverlo hacia áreas interesantes de diferentes tipos. Amalgamar la salida de cada comportamiento crea un movimiento final.
Las tripas del sistema se implementaron fácilmente, y TDD fue útil aquí para especificar de qué debe ser responsable cada subsistema.
Sin embargo, tuve problemas a la hora de especificar cómo interactúan los comportamientos y, lo que es más importante, cómo interactúan con el tiempo. A menudo no había una respuesta correcta, y aunque mis pruebas iniciales fueron aprobadas, el control de calidad podía seguir encontrando casos extremos en los que el sistema no funcionaba. Para encontrar la solución correcta, tuve que repetir varias conductas diferentes, y si actualizaba las pruebas cada vez para reflejar las nuevas conductas antes de comprobar que funcionaban en el juego, podría haber terminado tirando las pruebas una y otra vez. Así que eliminé esas pruebas.
Posiblemente debería haber tenido pruebas más fuertes que capturaron los casos extremos que QA descubrió, pero cuando tienes un sistema como este que se encuentra en la parte superior de muchos sistemas de juego y física, y estás lidiando con comportamientos con el tiempo, se vuelve un poco pesadilla para especificar exactamente lo que está sucediendo.
Es casi seguro que cometí errores en mi enfoque y, como dije para las entrañas del sistema, TDD funcionó de manera brillante e incluso admitió algunos refactores de optimización.