Descubrí que la TDD tiene un bajo rendimiento cuando se trata de sistemas emergentes. Soy desarrollador de videojuegos y recientemente utilicé TDD para crear un sistema que usa múltiples comportamientos simples para crear movimientos de apariencia realista para una entidad.
Por ejemplo, hay comportamientos responsables de alejarlo de áreas peligrosas de diferentes tipos y responsables de moverlo hacia áreas interesantes de diferentes tipos. La fusión de la salida de cada comportamiento crea un movimiento final.
Las agallas del sistema se implementaron fácilmente, y TDD fue útil aquí para especificar de qué debería ser responsable cada subsistema.
Sin embargo, tuve problemas cuando se trataba de especificar cómo interactúan los comportamientos y, lo que es más importante, cómo interactúan a lo largo del tiempo. A menudo no hubo una respuesta correcta, y aunque mis pruebas iniciales fueron aprobadas, el control de calidad pudo seguir encontrando casos en los que el sistema no funcionaba. Para encontrar la solución correcta, tuve que repetir varios comportamientos diferentes, y si actualizaba las pruebas cada vez que reflejaba los nuevos comportamientos antes de verificar que funcionaban en el juego, es posible que haya terminado tirando las pruebas una y otra vez. Así que borré esas pruebas.
Posiblemente debería haber tenido pruebas más sólidas que capturaron los casos de vanguardia que QA descubrió, pero cuando tienes un sistema como este que se encuentra sobre muchos sistemas de juego y física, y estás tratando con comportamientos a lo largo del tiempo, se convierte en una pesadilla para especificar exactamente lo que está sucediendo.
Es casi seguro que cometí errores en mi enfoque, y como dije para las agallas del sistema, el TDD funcionó de manera brillante e incluso apoyó a algunos refactores optimizadores.