Integrazione vs. unit test
È necessario mantenere i test unitari e i test di integrazione completamente separati. I test unitari dovrebbero testare una cosa e una sola cosa e in completo isolamento del resto del sistema. Un'unità è definita in modo approssimativo ma di solito si riduce a un metodo o una funzione.
Ha senso avere dei test per ogni unità in modo da sapere che i loro algoritmi sono implementati correttamente e si sa immediatamente cosa è andato storto dove, se l'implementazione è difettosa.
Dal momento che si esegue il test in completo isolamento durante il test unitario, si utilizzano stub e oggetti finti per comportarsi come il resto dell'applicazione. È qui che entrano in gioco i test di integrazione. Testare tutte le unità in isolamento è fantastico, ma è necessario sapere se le unità funzionano effettivamente insieme.
Ciò significa sapere se un modello è effettivamente archiviato in un database o se viene effettivamente emesso un avviso dopo il fallimento dell'algoritmo X.
Sviluppo guidato da test
Facendo un passo indietro e guardando Test Driven Development (TDD) ci sono diverse cose da prendere in considerazione.
- Scrivi il test unitario prima di scrivere effettivamente il codice che lo fa passare.
- Fai il superamento del test, scrivi il codice sufficiente per farlo.
- Ora che il test ha superato è tempo di fare un passo indietro. C'è qualcosa da refactoring con questa nuova funzionalità in atto? Puoi farlo in modo sicuro poiché tutto è coperto da test.
Integrazione prima vs integrazione per ultima
I test di integrazione si adattano a questo ciclo TDD in due modi. Conosco persone a cui piace scriverle in anticipo. Chiamano un test di integrazione un test end-to-end e definiscono un test end-to-end come un test che testa completamente l'intero percorso di un caso d'uso (pensa a impostare un'applicazione, avviarlo, andare su un controller, eseguirlo, verifica del risultato, dell'output, ecc ...). Quindi iniziano con il loro primo test unitario, lo fanno passare, aggiungono un secondo, lo fanno passare, ecc ... Lentamente sempre più parti del test di integrazione passano pure fino al completamento della funzione.
L'altro stile sta costruendo un test unitario per test unitario e aggiungendo successivamente i test di integrazione ritenuti necessari. La grande differenza tra questi due è che nel caso del test di integrazione prima sei costretto a pensare alla progettazione di un'applicazione. Questo tipo di disaccordo con la premessa che TDD riguarda la progettazione delle applicazioni tanto quanto i test.
Aspetti pratici
Nel mio lavoro abbiamo tutti i nostri test nello stesso progetto. Vi sono tuttavia gruppi diversi. Lo strumento di integrazione continua esegue prima quelli che sono contrassegnati come test unitari. Solo se quelli hanno successo vengono eseguiti anche i test di integrazione più lenti (perché fanno richieste reali, usano database reali, ecc.).
Ad ogni modo usiamo un file di prova per una classe.
Lettura consigliata
- Software orientato agli oggetti in crescita, guidato da test Questo libro è un ottimo esempio della prima metodologia del test di integrazione
- L'arte dei test unitari, con esempi in dot.net Su test unitari, con esempi in dot.net: D Ottimo libro sui principi alla base dei test unitari.
- Robert C. Martin su TDD (articoli gratuiti): leggi anche i primi due articoli che ha collegato lì.