Per fare questa domanda ho bisogno di definire un paio di termini per garantire che tutti quelli che lo leggono si trovino sulla stessa pagina:
- Il test delle unità è il test di una singola classe con tutte le dipendenze fittate / stubbate in qualche modo.
- Test di integrazione, in questo contesto, significa integrazione di una selezione di oggetti all'interno di un sistema con alcune potenziali dipendenze derise. Ad esempio, i collaboratori esterni (come un database o una terza parte remota) possono essere falsi, ma i sistemi interni possono anche essere derisi (ad esempio, deridere il meccanismo di autenticazione per funzionare sempre). L'idea è di far ruotare alcune parti del sistema non banali e verificare che si comporti.
- Il test funzionale sta facendo girare il sistema nel suo insieme e lo spinge a raggiungere i risultati desiderati. Ai fini di questa domanda, potrebbe essere contrario al confronto esterno reale
Dal punto di vista della piramide di test, dovremmo avere un 70% di integrazione dall'unità del 20% al 10% di test funzionali.
Con quanto sopra esposto, la mia domanda è la seguente: ho lavorato in ambienti in cui esiste una vasta suite di test unitari, ma i bug continuano ad emergere in fase di esecuzione a causa di test di integrazione insufficienti / test funzionali inesistenti. Anche con un'eccellente copertura unitaria di una data classe come quella classe viene effettivamente utilizzata / come è cablata nel resto del sistema in genere contiene più bug di quelli che si possono realmente catturare a livello di unità. Di solito questi bug vengono rilevati a livello di test di integrazione / funzionalità.
Garantito dai test unitari è possibile inserire il sistema in più stati e tendono a funzionare molto più rapidamente ma, come rilevatore di bug, cadono rispetto a test di integrazione / livello funzionale che guidano effettivamente i percorsi del codice. Quando sollevo questo punto con gli altri la solita risposta è quella di dire "oh, i test di integrazione sono in realtà trovare test unitari che non hai scritto!", Questo sembra valido a prima vista, ma tutto ciò significa che sto testando il mio codice due volte: una volta a livello di integrazione con copertura completa e una volta a livello di unità in cui non è possibile garantire il livello di copertura. Tuttavia ho bisogno di mantenere entrambi i set.
La mia domanda è se la configurazione del test di integrazione è ridotta al minimo / astratta in una libreria di installazione di test comune, allora perché non usare i test di integrazione come "prima linea" di test sui test unitari? Qual è il valore effettivo di testare tutto due volte?