Además de que parece que el tener que sincronizar una suite completa de los ensayos con código en constante cambio sería un dolor. Entiendo que la unidad de prueba de la unidad podría ayudar tremendamente a durante el mantenimiento, una vez que el software esté construido, estable y en funcionamiento, pero que está retrasado en el juego cuando TDD es supuestamente también desde el principio.
Estoy de acuerdo en que la sobrecarga de tener un conjunto de pruebas de unidad en su lugar se puede sentir en estos primeros cambios, cuando los principales cambios arquitectónicos están llevando a cabo, pero mi opinión es que los beneficios de tener pruebas unitarias son muy superiores a este retirarse. Con frecuencia pienso que el problema es mental: tendemos a pensar en nuestras pruebas unitarias como ciudadanos de segunda clase del código base, y nos molesta tener que meternos con ellos. Pero con el tiempo, a medida que he llegado a depender de ellos y aprecio su utilidad, he llegado a pensar en ellos como no menos importantes y no menos dignos de mantenimiento y trabajo que cualquier otra parte de la base de códigos.
¿Los principales "cambios" arquitectónicos tienen lugar realmente solo en refactorizaciones? Si solo está refacturando, aunque sea de manera espectacular, y las pruebas comiencen a fallar, eso puede indicarle que ha cambiado la funcionalidad de alguna otra manera. Que es exactamente lo que se supone que las pruebas unitarias te ayudarán a atrapar. Si realiza cambios radicales en la funcionalidad y la arquitectura al mismo tiempo, le recomendamos que reduzca la velocidad y entre en ese surco rojo/verde/refactor: sin funcionalidad nueva (o modificada) sin pruebas adicionales, y sin cambios en funcionalidad (y pruebas de interrupción) durante la refactorización.
Update (basado en los comentarios):
@Cybis ha planteado una objeción interesante para mi afirmación de que la refactorización no debe romper pruebas porque refactorización no debe cambiar el comportamiento. Su objeción es que refactorizar hace cambiar la API, y por lo tanto prueba "break".
En primer lugar, recomendaría a cualquiera que visite la referencia canónica sobre refactorización: Martin Fowler's bliki. Justo ahora he revisado y un par de cosas saltan a mí:
- Is changing an interface refactoring? Martin se refiere a refactorización como un cambio "comportamiento de preservación" , que significa cuando la interfaz/API cambia entonces todas las personas que llaman de esa interfaz /API debe cambiar también. Incluyendo pruebas, digo.
- Eso no significa que el comportamiento ha cambiado. Nuevamente, Fowler enfatiza que su definición de refactorización es que los cambios son del comportamiento preservando.
En vista de esto, si una prueba o pruebas tienen que cambiar durante una refactorización, no creo que esto "rompa" la (s) prueba (s). Es simplemente parte de la refactorización, de preservar el comportamiento de toda la base de códigos.No veo diferencia entre que una prueba tenga que cambiar y que cualquier otra parte de la base de código tenga que cambiar como parte de una refactorización. (Esto se remonta a lo que dije antes de considerar las pruebas para ser ciudadanos de primera clase de la base de código.)
Además, yo esperaría que las pruebas, incluso las pruebas modificadas, a continuar pasando una vez que la refactorización está hecho. Lo que sea que esa prueba estaba probando (probablemente la afirmación (es) en esa prueba) aún debería ser válida después de que se realiza una refactorización. De lo contrario, es una señal de alerta que el comportamiento cambió/retrocedió de alguna manera durante la refactorización. Quizás esa afirmación parezca absurda, pero piénselo: no creemos en mover bloques de código en la base del código de producción y esperar que continúen trabajando en su nuevo contexto (nueva clase, nueva firma de método, lo que sea) . Siento lo mismo con una prueba: quizás una refactorización cambia la API que debe llamar una prueba, o una clase que una prueba debe usar, pero al final el punto de la prueba no debería cambiar debido a una refactorización.
(La única excepción que puedo pensar en esto son las pruebas que prueban los detalles de implementación de bajo nivel que puede querer cambiar durante una refactorización, como reemplazar una lista vinculada por una lista de arreglos o algo así. Pero en ese caso uno podría argumentan que las pruebas son excesivas y son demasiado rígidas y frágiles.)
He estado pensando en lo mismo. En cierto modo, podría decirse que las pruebas violan DRY, ya que el comportamiento de un fragmento de código se refleja tanto en ese código como en el código que lo prueba. – Boris