When you write unit tests for A, you mock X. In other words, while unit testing A, you set (postulate) the behaviour of X's mock to be X1. Time goes by, people do use your system, needs change, X evolves: you modify X to show behaviour X2. Obviously, unit tests for X will fail and you will need to adapt them.
Woah, aspetta un momento. Le implicazioni dei test per il fallimento di X sono troppo importanti per sorvolare in questo modo.
Se cambiando l'implementazione di X da X1 a X2 si interrompe il test dell'unità per X, che indica che hai apportato una modifica all'indietro al contratto X.
X2 non è una X, nel Liskov senso , quindi dovresti pensare su altri modi per soddisfare le esigenze dei tuoi stakeholder (come l'introduzione di una nuova specifica Y, che è implementata da X2).
Per approfondimenti più approfonditi, vedi Pieter Hinjens: La fine delle versioni del software o Rich Hickey Semplice semplificato .
Dal punto di vista di A, c'è una precondizione che il collaboratore rispetta il contratto X. E la tua osservazione è efficace che il test isolato per A non ti dà alcuna garanzia che A riconosca collaboratori che violano il contratto X.
Rivedi I test integrati sono una truffa ; ad alto livello, ci si aspetta che tu abbia tanti test isolati di cui hai bisogno per assicurarti che X2 implementa correttamente il contratto X, e quanti test isolati hai bisogno per assicurarti che A faccia la cosa giusta, date risposte interessanti da una X, e un numero inferiore di test integrati per garantire che X2 e A siano d'accordo su cosa significa X.
A volte vedrai questa distinzione espressa come test solitario rispetto a sociable
test ; vedi Jay Fields Lavorare efficacemente con i test delle unità .
Shouldn't we focus more on integration testing?
Ancora una volta, vedere i test integrati sono una truffa - Rainsberger descrive in dettaglio un ciclo di feedback positivo che è comune (nelle sue esperienze) a progetti che fanno affidamento sui test integrati (spelling delle note). In sintesi, senza i test isolati / solitari facendo pressione sul design , la qualità degrada, portando a più errori e test più integrati ....
Avrai anche bisogno di (alcuni) test di integrazione. Oltre alla complessità introdotta da più moduli, l'esecuzione di questi test tende ad avere più resistenza rispetto ai test isolati; è più efficiente iterare su controlli molto rapidi quando il lavoro è in corso, salvando i controlli aggiuntivi per quando pensi di essere "finito".