Come faccio a sapere se ho abbastanza copertura unit test per rimuovere un test di integrazione?


15

Sto lavorando su un sistema legacy (intendo dire che è stato scritto senza test). Abbiamo provato a testare parte del sistema scrivendo test di integrazione che testano la funzionalità dall'esterno.

Questo mi dà un po 'di fiducia nel refactoring di parti del codice senza preoccuparmi di romperlo. Ma il problema è che questi test di integrazione richiedono una distribuzione (2+ minuti) e molti minuti per l'esecuzione. Inoltre, sono un dolore da mantenere. Ciascuno di essi copre migliaia di righe di codice e quando una di esse si interrompe possono essere necessarie ore per il debug del perché.

Ho scritto molti test unitari per questi cambiamenti funzionali che ho apportato di recente, ma prima di impegnarmi faccio sempre una nuova distribuzione ed eseguo tutti i test di integrazione, solo per assicurarmi di non aver perso nulla. A questo punto conosco i miei test unitari e alcuni dei test di integrazione si sovrappongono a ciò che testano.

Come faccio a sapere se i miei buoni test unitari coprono adeguatamente un test di integrazione errato in modo da poter eliminare quel test di integrazione?

Risposte:


18

La metrica più semplice è chiedere "quando è stata l'ultima volta che questo test di integrazione ha fallito legittimamente ?" Se è passato molto tempo (ci sono stati molti cambiamenti) da quando il test di integrazione non è riuscito, allora i test unitari stanno probabilmente facendo un buon lavoro. Se il test di integrazione è fallito di recente, si è verificato un difetto che non è stato rilevato dai test unitari.

La mia preferenza sarebbe generalmente quella di aumentare la solidità dei test di integrazione, al punto da poter essere eseguiti in modo affidabile senza sorveglianza. Se impiegano molto tempo a correre, quindi eseguili durante la notte. Sono ancora preziosi anche se vengono eseguiti solo occasionalmente. Se questi test sono troppo fragili o richiedono un intervento manuale, potrebbe non valere la pena spendere il tempo per mantenerli in esecuzione e potresti considerare di scartare quelli che riescono più spesso.


3
+1 per raccomandare i test da automatizzare poiché ciò porta all'ovvia domanda di "Perché interrompere un test automatizzato?"

1
Sì, sono d'accordo con questo. Ovviamente, anche questo ti morde ancora se non hai abbastanza copertura unit test. Ad esempio, al momento disponiamo di una suite di test di integrazione che richiede circa 6 ore per essere eseguita ... ma non credo che un test sia MAI stato eliminato a causa della concentrazione della mia azienda sulla compatibilità
Earlz,

2
Forse dovrei iniziare una nuova domanda per questo, ma suggerisci che ogni volta che un test di integrazione fallisce legittimamente dovrei capire come scrivere un test unitario che fallisce e farli passare entrambi?
Daniel Kaplan,

2
@tieTYT: Sì, sembra assolutamente una buona idea. I test unitari sono buoni; i test unitari per le cose che sai che hanno già rotto prima sono ancora meglio.
Greg Hewgill,

7

I test unitari non sono il Santo Graal dei test, sono solo uno degli strumenti di molti di quelli che dovrebbero essere usati per testare una base di codice. Pertanto, nessuna quantità di test unitari dovrebbe mai essere considerata sicura per sostituire altri test. Se hai un cattivo test di integrazione, dovresti lavorare per renderlo un buon test di integrazione, non sostituirlo con qualcos'altro, è come sostituire la tua porta d'ingresso con una recinzione perimetrale e un cancello.


Se questo progetto fosse partito da zero, avrebbe più senso per me. Ma il mio primo test di integrazione è stato "verifica che tu possa accedere" e alla fine ho fatto molti test unitari che "controllano che tu possa accedere". Il test di integrazione si interrompe continuamente se si modifica l'html. Questo esempio è completamente inventato, ma non è un buon caso per rimuovere il test di integrazione?
Daniel Kaplan,

3
@tieTYT: testare qualcosa attraverso l'interfaccia utente porta spesso a una soluzione molto instabile. Tuttavia, i test eseguiti dall'IU sono importanti, a volte accade che i test manuali qui producano meno sforzi rispetto al tentativo di automatizzare quel test e mantenerlo stabile. Quindi, quando pensi che questo sia il caso qui, puoi rimuovere quel "test di integrazione" dall'elenco dei test automatici e aggiungerlo al tuo piano di test di test manuali.
Doc Brown,

@DanielKaplan sarebbe possibile aggiornare il test di integrazione per renderlo più stabile? Se fallisce perché l'html cambia a volte, quindi prova qualcosa come "nome utente appare sulla pagina dopo il login" piuttosto che qualcosa di più specifico come "nome utente appare all'interno di questo div dopo il login"
Jen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.