TDD es una compensación "pagueme ahora o pague después". Si solo cuenta el tiempo desde el inicio de la codificación hasta el registro de su código, TDD generalmente toma más tiempo, especialmente cuando primero aprende TDD. El pago viene más tarde durante la fase de prueba, y también en futuras rondas de codificación.
Para la fase de pruebas, descubrí que con TDD:
- que tenía substancialmente menos errores. Mi último código TDD tuve errores solo debido a malentendidos (o cambios) de los requisitos o en las áreas donde no pude poner el código bajo prueba (código PHP en ese caso).
- Los errores que tenía eran generalmente más fáciles de reproducir bajo prueba, porque ya había probado el sistema.
- La solución de los errores fue más rápida, y con las pruebas podría tener una mayor creencia de que no introduje nuevos errores.
El código en sí tenía las siguientes propiedades:
Como empecé a pensar como un cliente del código, el código tendían a ser más fácil de usar. (Este es uno de los beneficios de escribir pruebas primero).
El código es más fácil de probar.
Escribir pruebas de unidad es más fácil (y en muchos casos más divertido) justo antes que después, por lo que se escriben más pruebas.
El código es más fácil de refactorizar y limpiar. Esto fue particularmente cierto con Python, donde las herramientas de refactorización automáticas tienen más dificultades.
Debido a eso, cuando llegó el momento de volver a examinar el código, era más fácil de entender y fácil de cambiar, y además teníamos al menos algunas pruebas de regresión ya en su lugar.
Lo que esto significa es que la amortización del tiempo TDD puede ser meses posterior. Además, iniciar TDD con código heredado es particularmente difícil. Luego, se necesita tiempo para aprender a escribir buenas pruebas (un conjunto de pruebas incorrecto puede ser insuficiente o peor, ser frágil y dificultar, no hacer las refactorizaciones) y cómo probar un sistema complejo.
Tengo que admitir que no he sido capaz de conseguir que muchas otras personas cambien a TDD.Creo que cambié en gran medida porque quería una forma más sencilla de prueba y también tuve la oportunidad de aprender cómo con una pequeña base de código y un proyecto personal.
es posible que desee utilizar la frase completa 'desarrollo impulsado por pruebas' en algún lugar de su pregunta. – Jherico
o, de hecho, diseño impulsado por prueba ... –
Es importante señalar que la pregunta es sobre desarrollo/diseño impulsado por prueba, no simplemente pruebas unitarias. Las respuestas que simplemente abordan las pruebas unitarias están perdiendo sentido, creo. Mucha gente (probablemente la mayoría) que prueba la unidad no compra en TDD. – Chuck