Nelle ultime settimane ho rimuginato e studiato come colmare una lacuna nella nostra metodologia di test. In termini semplificati, i test unitari sono troppo piccoli e i test di integrazione tradizionali sono troppo grandi.
Si presenta uno scenario frequente in cui A
e B
utilizzano entrambi componente C
. Tuttavia A
e B
hanno requisiti leggermente diversi per, e fanno ipotesi leggermente diverse su C
. Se sono lo sviluppatore di A
come e dove collaudo le mie ipotesi su C
?
Ovviamente il test unitario A
con ipotesi assurde su C
va bene per testare A
in isolamento, ma non prova le ipotesi stesse.
Un'altra possibilità è aggiungere test unitari per C
. Tuttavia questo non è l'ideale perché, mentre A
è in sviluppo, l'alterazione dei test per C
con ipotesi in evoluzione da A
sarà eccessivamente maldestra. Infatti, lo sviluppatore di A
s potrebbe non avere nemmeno un accesso adeguato ai test unitari di C
(ad esempio una libreria esterna).
Per inquadrare questo con un esempio più concreto: supponi che questa sia un'applicazione di nodo. A
e B
dipendono da C
per leggere un file (tra le altre cose) e memorizzare il contenuto del file in oggetto passato a C
. All'inizio tutti i file che C
gestisce sono piccoli e possono essere letti in modo sincrono senza blocchi significativi. Tuttavia lo sviluppatore di B
si rende conto che i suoi file stanno diventando enormi e ha bisogno di cambiare C
in una lettura asincrona. Ciò si traduce in un errore di sincronizzazione sporadica in A
, che presuppone ancora che C
stia leggendo i file in modo sincrono.
Questo è il tipo di bug che è notoriamente difficile da rintracciare dai test di integrazione completi e che potrebbe non essere affatto coinvolto nei test di integrazione. Inoltre, non viene rilevato dai test unitari di A
s perché le ipotesi di A
s vengono prese in giro. Tuttavia potrebbe facilmente essere catturato da un test di integrazione "mini" che esercita solo A
e C
.
Ho trovato solo alcuni riferimenti a questo tipo di test. Integrazione nel Piccolo , Component Integration Testing , Integrazione unità Test. Si riferisce anche a test BDD piuttosto che a un test formale dell'unità TDD.
Come posso colmare questo vuoto di test? Specificamente - dove metto tali test? Come faccio a simulare gli input di A
e C
per i test di integrazione "mini"? E quanto sforzo dovrebbe essere messo nel separare le preoccupazioni dei test tra questi test e i test unitari? O c'è un modo migliore per riempire il vuoto test?