Secondo la mia esperienza, i nostri Test di servizio non devono essere vincolati da dipendenze che l'esecuzione è fuori dal nostro controllo.
Prima di tutto, restringiamo l'ambito dei test. Come indicato nella domanda, il servizio sotto test è A , quindi concentriamoci sulla verifica A , indipendentemente dalla proprietà di B e dal suo stato ( in esecuzione, bacato o no).
Una cosa importante da raggiungere con i test è il determinismo . L'unico modo in cui dobbiamo garantire il corretto comportamento di A in base alle premesse dei requisiti (non) funzionali è l'implementazione di test che riproducono queste premesse.
Un modo per raggiungere il determinismo è implementare mocks e / o stubss come servizio A dipendenze . Noi riprodurremo i casi d'uso di cui abbiamo bisogno attraverso questi. Qualcuno potrebbe pensare che questo non sia un test di integrazione, ma i test di integrazione non sono necessariamente privati da mock e stubbs. Alcune integrazioni potrebbero coinvolgere più componenti che lavorano insieme. In questi casi, è bene essere in grado di isolare ciascuna di queste integrazioni in modo da poter verificare il comportamento del nostro componente in diverse e diverse condizioni di integrazione.
The problem I see is service B updates a database so any integration
tests in service A will have to reset any changes they make by calling
the DB directly.
La scrittura di Servizio B nel DB è quasi aneddotica. Provando contro un vero servizio B stiamo, indirettamente, testando il servizio B stesso e l'intero ambiente in cui il servizio è in esecuzione!
Il vero pericolo è nelle condizioni indeterminate in cui Service B sta vivendo al momento del test. Queste condizioni, nel peggiore dei casi, causeranno il fallimento dei test Service A . Falliranno a causa di problemi non correlati al codice. Questi errori non ci danno un feedback significativo sullo stato del codice testato.
Scrivere in DB è il minore dei problemi, ci sono molte più cose che potrebbero andare storte. Ad esempio.
- Il servizio B non ha un ambiente di prova.
- Il servizio B ha un ambiente di test ma è stata distribuita una nuova versione che include le modifiche di interruzione.
- Il servizio B è bacato.
- L'archiviazione dei dati del servizio B è inattiva o temporaneamente non disponibile.
- Il servizio B risponde con dati corrotti.
- Il servizio B è in fase di test e i dati cambiano frequentemente.
- Il servizio B non è più disponibile.
Dovresti chiederti perché i test non deterministici sono pericolosi. Suggerisco di leggere il blog di Fowler su Eliminare il non-determinismo nei test . Dai un'occhiata anche a questa domanda . La risposta di Doc riassume molto bene l'argomento.
Un esempio di test non deterministici sono Test di sfarfallio . I test instabili sono test che alla fine falliscono a causa di circostanze indeterminate, e di conseguenza i nostri test falliscono di tanto in tanto.
A test suite with flaky tests can become victim of what Diana Vaughan calls normalization of deviance - the idea that over time we can become so accustomed to things being wrong that we start to accept them as being normal and not a problem.
-Building Microservices- by Sam Newman
La normalizzazione della devianza è il seme del male.
Mi spiace, sto divagando ...
Any advice or thoughts?
Durante il test delle integrazioni, né i dati né il comportamento del servizio esterno dovrebbero preoccuparti. Almeno non ancora. 1
Ciò che dovrebbe preoccuparti è testare il corretto consumo di interfaccia (API) e la corretta gestione del feedback (gestione degli errori, deserializzazione, mappature, ecc.). In altre parole, il contratto .
Ultimamente, ho iniziato a lavorare con il concetto di Test doppio e Controlli sui contratti con i clienti con risultati molto positivi.
È vero che richiedono ulteriori sforzi per costruire e mantenere questi test. Questo è il nostro caso. Tuttavia, abbiamo ridotto in modo significativo l'edificio, i test e il tempo di implementazione e otteniamo un feedback più rapido e più significativo da CI.
In linea con la suddetta scrittura e la risposta di @ Justin, potresti essere interessato a strumenti come Mountebank .
1: esiste un posto per i test indirizzati a convalidare il comportamento reale dei servizi esterni. Possono essere posizionati fuori dalla conduttura dell'edificio. Potrebbero o potrebbero non essere essenziali per una distribuzione verde. Dipende se puoi o meno eludere i problemi sollevati dal servizio. È quasi una questione politica piuttosto che tecnica.