Qual è la differenza tra test unitari, funzionali, di accettazione e di integrazione (e qualsiasi altro tipo di test che non ho menzionato)?
Qual è la differenza tra test unitari, funzionali, di accettazione e di integrazione (e qualsiasi altro tipo di test che non ho menzionato)?
Risposte:
A seconda di dove guardi, otterrai risposte leggermente diverse. Ho letto molto sull'argomento, ed ecco la mia distillazione; di nuovo, questi sono leggermente lanosi e altri potrebbero non essere d'accordo.
Test unitari
Verifica la più piccola unità di funzionalità, in genere un metodo / funzione (ad esempio, data una classe con uno stato particolare, la chiamata del metodo x sulla classe dovrebbe causare y). I test unitari dovrebbero essere focalizzati su una caratteristica particolare (ad esempio, chiamare il metodo pop quando lo stack è vuoto dovrebbe lanciare un InvalidOperationException
). Tutto ciò che tocca dovrebbe essere fatto in memoria; ciò significa che il codice test e il codice testato non dovrebbero:
Qualsiasi tipo di dipendenza che è lenta / difficile da comprendere / inizializzare / manipolare dovrebbe essere cancellata / derisa / qualunque cosa usando le tecniche appropriate in modo da poter concentrarsi su ciò che l'unità di codice sta facendo, non su ciò che fanno le sue dipendenze.
In breve, i test unitari sono quanto più semplici possibili, facili da eseguire il debug, affidabili (a causa di fattori esterni ridotti), rapidi da eseguire e aiutano a dimostrare che i più piccoli elementi costitutivi del programma funzionano come previsto prima che vengano messi insieme. L'avvertenza è che, anche se puoi dimostrare che funzionano perfettamente in isolamento, le unità di codice possono esplodere quando combinate, il che ci porta a ...
Test di integrazione
I test di integrazione si basano su test unitari combinando le unità di codice e verificando che la combinazione risultante funzioni correttamente. Questo può essere sia l'interno di un sistema, sia la combinazione di più sistemi per fare qualcosa di utile. Inoltre, un'altra cosa che differenzia i test di integrazione dai test unitari è l'ambiente. I test di integrazione possono e utilizzano i thread, accedono al database o fanno tutto il necessario per garantire che tutto il codice e le diverse modifiche all'ambiente funzionino correttamente.
Se hai creato un codice di serializzazione e l'unità ha testato le sue parti interne senza toccare il disco, come fai a sapere che funzionerà durante il caricamento e il salvataggio su disco? Forse hai dimenticato di svuotare e gettare i filestream. Forse i tuoi permessi sui file non sono corretti e hai testato le viscere usando nei flussi di memoria. L'unico modo per scoprirlo con certezza è testarlo "davvero" utilizzando un ambiente più vicino alla produzione.
Il vantaggio principale è che troveranno bug che i test unitari non possono come ad esempio i bug di cablaggio (ad esempio un'istanza di classe A riceve inaspettatamente un'istanza nulla di B) e bug di ambiente (funziona bene sulla mia macchina a CPU singola, ma il mio la macchina a 4 core del collega non può superare i test). Lo svantaggio principale è che i test di integrazione toccano più codice, sono meno affidabili, i guasti sono più difficili da diagnosticare e i test sono più difficili da mantenere.
Inoltre, i test di integrazione non dimostrano necessariamente che funzioni complete. L'utente potrebbe non preoccuparsi dei dettagli interni dei miei programmi, ma lo faccio!
Test funzionali
I test funzionali verificano la correttezza di una particolare funzionalità confrontando i risultati per un determinato input con le specifiche. I test funzionali non riguardano se stessi con risultati intermedi o effetti collaterali, ma solo il risultato (a loro non importa che dopo aver fatto x, l'oggetto y abbia lo stato z). Sono scritti per testare parte delle specifiche, ad esempio "chiamando la funzione Square (x) con l'argomento 2 restituisce 4".
Test di accettazione
Il test di accettazione sembra essere diviso in due tipi:
Il test di accettazione standard prevede l'esecuzione di test su tutto il sistema (ad es. Utilizzo della pagina Web tramite un browser Web) per verificare se la funzionalità dell'applicazione soddisfa le specifiche. Ad esempio "facendo clic sull'icona di uno zoom si dovrebbe ingrandire la vista del documento del 25%". Non esiste un vero continuum di risultati, solo un risultato positivo o negativo.
Il vantaggio è che i test sono descritti in un inglese semplice e garantisce che il software, nel suo insieme, sia completo. Lo svantaggio è che hai spostato di un altro livello la piramide dei test. I test di accettazione toccano montagne di codice, quindi rintracciare un fallimento può essere complicato.
Inoltre, nello sviluppo agile del software, i test di accettazione dell'utente comportano la creazione di test per rispecchiare le storie degli utenti create da / per il cliente del software durante lo sviluppo. Se i test superano, significa che il software deve soddisfare i requisiti del cliente e le storie possono essere considerate complete. Una suite di test di accettazione è fondamentalmente una specifica eseguibile scritta in una lingua specifica del dominio che descrive i test nella lingua utilizzata dagli utenti del sistema.
Conclusione
Sono tutti complementari. A volte è vantaggioso concentrarsi su un tipo o evitarli del tutto. La differenza principale per me è che alcuni dei test guardano le cose dal punto di vista di un programmatore, mentre altri usano un focus cliente / utente finale.
L'importante è che tu sappia cosa significano quei termini per i tuoi colleghi. Diversi gruppi avranno definizioni leggermente diverse di ciò che significano quando dicono test "end-to-end" completi, per esempio.
Di recente mi sono imbattuto nel sistema di denominazione di Google per i loro test e mi piace piuttosto: ignorano gli argomenti semplicemente usando Small, Medium e Large. Per decidere in quale categoria rientra un test, prendono in considerazione alcuni fattori: quanto tempo richiede l'esecuzione, accede alla rete, al database, al filesystem, ai sistemi esterni e così via.
http://googletesting.blogspot.com/2010/12/test-sizes.html
Immagino che la differenza tra Small, Medium e Large per il tuo posto di lavoro attuale possa variare da quella di Google.
Tuttavia, non si tratta solo di portata, ma di scopo. Il punto di Mark sulle diverse prospettive per i test, ad esempio programmatore vs cliente / utente finale, è davvero importante.
http://martinfowler.com/articles/microservice-testing/
Il post sul blog di Martin Fowler parla delle strategie per testare il codice (specialmente in un'architettura di micro-servizi) ma la maggior parte si applica a qualsiasi applicazione.
Citerò dalla sua diapositiva di riepilogo:
- Test unitari: esercita i più piccoli software testabili nell'applicazione per determinare se si comportano come previsto.
- Test di integrazione: verifica i percorsi di comunicazione e le interazioni tra i componenti per rilevare i difetti di interfaccia.
- Test dei componenti: limitare l'ambito del software esercitato a una parte del sistema in prova, manipolando il sistema attraverso interfacce di codice interne e utilizzando doppi test per isolare il codice in prova da altri componenti.
- Prove contrattuali: verificare le interazioni al limite di un servizio esterno affermando che soddisfa il contratto previsto da un servizio di consumo.
- Test end-to-end: verifica che un sistema soddisfi i requisiti esterni e raggiunga i suoi obiettivi, testando l'intero sistema, da un capo all'altro.
Test unitari - Come suggerisce il nome, questo metodo verifica a livello di oggetto. I singoli componenti software sono testati per eventuali errori. La conoscenza del programma è necessaria per questo test e i codici di test vengono creati per verificare se il software si comporta come previsto.
Test funzionali - Viene eseguito senza alcuna conoscenza del funzionamento interno del sistema. Il tester tenterà di utilizzare il sistema semplicemente seguendo i requisiti, fornendo input diversi e testando gli output generati. Questo test è anche noto come test a scatola chiusa o scatola nera.
Test di accettazione : si tratta dell'ultimo test condotto prima che il software venga consegnato al client. Viene eseguito per garantire che il software sviluppato soddisfi tutti i requisiti del cliente. Esistono due tipi di test di accettazione: uno che viene eseguito dai membri del team di sviluppo, noto come test di accettazione interno (test Alpha) e l'altro che viene eseguito dal cliente o dall'utente finale noto come (beta test)
Test di integrazione : i singoli moduli già sottoposti a test di unità sono integrati tra loro. Generalmente vengono seguiti i due approcci:
1) Top-Down
2) Bottom-Up
Questo è molto semplice
Test unitari: sono i test effettivamente eseguiti dagli sviluppatori con conoscenze di codifica. Questo test viene eseguito in fase di codifica ed è parte del test in white box. Quando un software arriva per lo sviluppo, viene sviluppato nel pezzo di codice o sezioni di codice noto come unità. E i test individuali di queste unità hanno chiamato test unitari eseguiti dagli sviluppatori per scoprire alcuni tipi di errori umani come la mancanza di copertura delle dichiarazioni, ecc.
Test funzionali: questo test viene eseguito durante la fase di test (QA) ed è parte del test black box. L'esecuzione effettiva dei casi di test scritti in precedenza. Questo test viene effettivamente eseguito dai tester, trovano il risultato effettivo di qualsiasi funzionalità nel sito e confrontano questo risultato con il risultato previsto. Se hanno trovato qualche disparità, questo è un bug.
Test di accettazione: noto come UAT. E ciò è stato effettivamente fatto dal tester, nonché da sviluppatori, team di gestione, autore, scrittori e tutti coloro che sono coinvolti in questo progetto. Per garantire che il progetto sia finalmente pronto per essere consegnato senza bug.
Test di integrazione: le unità di codice (spiegate al punto 1) sono integrate tra loro per completare il progetto. Queste unità di codice possono essere scritte in diverse tecnologie di codifica o possono avere versioni diverse, quindi questo test viene eseguito dagli sviluppatori per garantire che tutte le unità del codice siano compatibili con altre e che non vi siano problemi di integrazione.
Alcune idee (relativamente) recenti contro l'eccessivo derisione e il puro test unitario:
Ti spiegherò questo con un esempio pratico e senza roba teorica:
Uno sviluppatore scrive il codice. Nessuna GUI è ancora implementata. Il test a questo livello verifica che le funzioni funzionino correttamente e che i tipi di dati siano corretti. Questa fase di test si chiama Unit testing.
Quando viene sviluppata una GUI e l'applicazione viene assegnata a un tester, verifica i requisiti aziendali con un client ed esegue i diversi scenari. Questo si chiama test funzionale. Qui stiamo mappando i requisiti del cliente con i flussi delle applicazioni.
Test di integrazione: supponiamo che la nostra applicazione abbia due moduli: risorse umane e finanza. Il modulo HR è stato consegnato e testato in precedenza. Ora la finanza è sviluppata ed è disponibile per il test. Le funzionalità interdipendenti sono ora disponibili anche, quindi in questa fase testerai i punti di comunicazione tra i due e verificherai che funzionino come richiesto nei requisiti.
Il test di regressione è un'altra fase importante, che viene eseguita dopo ogni nuovo sviluppo o correzione di errori. Il suo scopo è verificare funzioni precedentemente funzionanti.
unit test: test di singoli moduli o componenti indipendenti in un'applicazione sono noti per essere unit test, i test unitari saranno eseguiti dallo sviluppatore.
test di integrazione: combinando tutti i moduli e testando l'applicazione per verificare che la comunicazione e il flusso di dati tra i moduli funzionino correttamente o meno, questo test viene eseguito anche dagli sviluppatori.
test funzionale che verifica la funzionalità individuale di un'applicazione è un test funzionale
test di accettazione questo test viene eseguito dall'utente finale o dal cliente, indipendentemente dal fatto che l'applicazione di compilazione sia conforme ai requisiti del cliente e che le specifiche del cliente siano note come test di accettazione