2013-05-23 13 views
24

Sto iniziando a utilizzare il test delle unità nei miei progetti e sto scrivendo i test che stanno testando il metodo/livello di funzione.Esattamente ciò che è il test di integrazione - rispetto all'unità

Capisco questo e ha senso.

Ma, qual è il test di integrazione? Da quello che ho letto sposta lo scopo del testing fino a testare le funzionalità più grandi di un'applicazione.

Ciò implica che scrivo una nuova suite di test per testare funzionalità più estese quali la funzionalità di checkout (su un sito di e-commerce), la funzionalità di accesso dell'utente, la funzionalità del carrello. Quindi qui avrei scritto 3 test di integrazione?

È corretto - se non è possibile qualcuno può spiegare cosa si intende.

Inoltre, il test di integrazione coinvolge l'interfaccia utente (contesto dell'applicazione Web qui) e impiegherebbe il selenio per automatizzare. Oppure il test di integrazione è ancora a livello di codice, ma unisce le classi di differenza e le aree del codice.

risposta

25

Considerare un metodo come questo PerformPayment(double amount, PaymentService service);

Un test di unità sarebbe un test in cui viene creato un mock per l'argomento service.

Un test di integrazione è un test in cui si utilizza un servizio esterno effettivo per verificare se tale servizio risponde correttamente ai dati di input.

+0

Così sono questi fatto a livello di interfaccia utente? usando il selenio, o c'è un'altra suite di test scritta, simile alla suite di test unitaria ma di portata più ampia? –

+0

Non necessariamente. Pensa a PaymentService usando una risorsa esterna, come un database o un'API di terze parti. Potrebbero essere necessari alcuni secondi per accedere (in caso di brutta giornata) o potrebbe essere solo un processo di lunga durata. È troppo lento per il test delle unità (quindi prendilo in giro), ma vuoi comunque testarlo per assicurarti che funzioni correttamente. È qui che entra in gioco il test di integrazione. Non si tratta di test che si eseguono ripetutamente, di solito prima di eseguire un rilascio o si dispone del CI che li esegue. – firelore

0

Per quanto vedo i test del selenio dovrebbero essere in un'altra suite di test. Questi test sono il test più fragile in natura anche se li scrivi correttamente. Qui puoi usare Specflow o qualche altro tipo di specifica per esempio framework. Forse puoi chiamare questi test come test di accettazione. Questi sono anche per sviluppatori ed esperti di business. I test di integrazione o modulo normalmente non utilizzano l'interfaccia utente. I test di integrazione esercitano alcune classi che stanno lavorando insieme. Questi sono test di livello inferiore rispetto ai test di selenio e un po 'più facili da mantenere. Questi test sono solo per gli sviluppatori.

0

Qui ci sono un paio di vincoli che un buon test unitario soddisfa. Soddisfare questi vincoli richiedeva anche un buon codice testabile.

  1. No I/O - disco o rete
  2. solo asserzione (se multiple, dovrebbero essere variazioni minori di uno dall'altro)
  3. non esercita (copertura) molto più codice di produzione di quello che afferma

Questi limiti di solito non si applicano ai test di integrazione.

1

Il test delle unità è dove si sta testando la logica di business all'interno di una classe o di una parte di codice. Ad esempio, se stai testando che una particolare sezione del tuo metodo dovrebbe chiamare un repository, il tuo test dell'unità controllerà che il metodo dell'interfaccia che chiama il repository sia chiamato il numero corretto di volte che ti aspetti, altrimenti fallisce il test.

Il test di integrazione, d'altro canto, sta verificando che il comportamento effettivo del servizio o del repository (database) sia corretto. Sta controllando che in base ai dati che hai inviato recuperi i risultati attesi. Ciò si ricollega ai test di unità in modo da sapere quali dati si dovrebbero recuperare e cosa fa con tali dati.

0

test unitari sono prove che il codice testato è all'interno della classe effettiva. Un'altra dipendenza di questa classe viene derisa o ignorata, poiché l'attenzione è testare il codice all'interno della classe.

I test di integrazione sono test che riguardano l'accesso al disco, il servizio applicativo e/oi framework dall'applicazione di destinazione. I test di integrazione eseguiti isolati da un altro servizio.

darò un esempio. Hai un'applicazione Spring e hai effettuato molti test unitari per garantire che la logica aziendale funzioni correttamente. Perfezionare. Ma che tipo di test è necessario garantire:

  • Il servizio applicazione può iniziare
  • vostra entità di database è mappato correttamente
  • Hai tutte le annotazioni necessarie a lavorare come previsto
  • il filtro funziona correttamente
  • tuo API è accettare un qualche tipo di dati
  • tua caratteristica principale è davvero che lavorano nello scenario base
  • la query di database sta funzionando come previsto
  • Etc ...

Questo non può essere fatto con test di unità, ma si (beh, Primavera Fetta può fare un po 'di loro ...), come sviluppatore, è necessario garantire anche questo. Questo è il ruolo dei test di integrazione.

Lo scenario ideale è il test di integrazione in esecuzione indipendente da un altro sistemi che l'applicazione potrebbe utilizzare in un ambiente di produzione (usando Wiremock per le chiamate riposo, una base di dati di memoria, ecc).

Una piccola curiosità: Maven ha un plugin specifico per i test di integrazione: la maven failsafe plugin che ha eseguito le classi di test che la finitura nome con IT. Esempio: UserIT.java.

La confusione su ciò che l'integrazione di sperimentazione si intende

Alcune persone capire il "test di integrazione" come un test che coinvolge l ' "integrazione" per altri sistemi che attualmente uso del sistema. Questo tipo di test può essere fatto solo in un ambiente in cui hai tutti questi sistemi per assisterti.

questo potrebbe essere solo un problema di denominazione, ma abbiamo una mancanza di test (quello che ho capito come test di integrazione) che si sente la necessità degli elementi sopra descritti. Al contrario, stiamo saltando per una definizione di unit test (solo test class) per un test di integrazione (l'intero sistema reale in alto). Cosa c'è nel mezzo se non i test di integrazione?