Cuando escribes pruebas unitarias para A, te burlas de X. En otras palabras, mientras pruebas unitaria A, estableces (postulas) el comportamiento de la simulación de X como X1. El tiempo pasa, la gente usa su sistema, necesita cambios, X evoluciona: usted modifica X para mostrar el comportamiento X2. Obviamente, las pruebas unitarias para X fallarán y deberá adaptarlas.
Woah, espera un momento. Las implicaciones de las pruebas para la falla de X son demasiado importantes para pasar por alto de esa manera.
Si cambiar la implementación de X de X1 a X2 rompe las pruebas unitarias para X, eso indica que ha realizado un cambio incompatible hacia atrás en el contrato X.
X2 no es una X, en el sentido de Liskov , por lo que debe pensar en otras formas de satisfacer las necesidades de sus partes interesadas (como la introducción de una nueva especificación Y, implementada por X2).
Para obtener información más profunda, vea Pieter Hinjens: El fin de las versiones de software , o Rich Hickey Simple Made Easy .
Desde la perspectiva de A, existe una condición previa de que el colaborador respete el contrato X. Y su observación es efectivamente que la prueba aislada para A no le garantiza que A reconozca a los colaboradores que violen el contrato X.
Revisar las pruebas integradas son una estafa ; en un nivel alto, se espera que tenga tantas pruebas aisladas como necesite para asegurarse de que X2 implemente el contrato X correctamente, y tantas pruebas aisladas como sea necesario para asegurarse de que A haga lo correcto con respuestas interesantes de una X, y un número menor de pruebas integradas para garantizar que X2 y A estén de acuerdo con lo que significa X.
Algunas veces verá esta distinción expresada como pruebas solitarias versus sociable
pruebas; ver Jay Fields trabajando eficazmente con pruebas unitarias .
¿No deberíamos centrarnos más en las pruebas de integración?
Una vez más, ver que las pruebas integradas son una estafa: Rainsberger describe en detalle un ciclo de retroalimentación positiva que es común (en su experiencia) a proyectos que dependen de pruebas integradas (ortografía de notas). En resumen, sin las pruebas aisladas / solitarias que aplican presión al diseño , la calidad se degrada, lo que lleva a más errores y pruebas más integradas ...
También necesitará (algunas) pruebas de integración. Además de la complejidad introducida por múltiples módulos, la ejecución de estas pruebas tiende a tener más resistencia que las pruebas aisladas; es más eficiente iterar en verificaciones muy rápidas cuando el trabajo está en progreso, guardando las verificaciones adicionales para cuando cree que está "listo".
X1
que está diciendo queX
implementa la interfazX1
. Si cambia la interfazX1
alX2
simulacro que usó en las otras pruebas, ya no debería compilar, por lo tanto, se ve obligado a corregir esas pruebas también. Los cambios en el comportamiento de la clase no deberían importar. De hecho, su claseA
no debería depender de los detalles de implementación (que es lo que estaría cambiando en ese caso). Por lo tanto, las pruebas unitariasA
todavía son correctas y le dicen queA
funciona dada una implementación ideal de la interfaz.