Cos'è una buona strategia di test di integrazione?

7

Sto iniziando un progetto in cui voglio avere una copertura di test piuttosto approfondita, e ho il lusso di guidare la strategia di test. Ho optato per un piano realizzabile per i test unitari e ho anche deciso di utilizzare Gherkin per descrivere le funzionalità e una porta di Cucumber per eseguire gli scenari come test di accettazione end-to-end.

Il problema è che sento che c'è una lacuna tra questi due livelli. Posso testare tutte le mie unità da solo, e posso verificare che le mie funzioni funzionino, ma posso pensare ad altre cose che voglio testare.

Vengo anche da un altro progetto con test automatici (implementati male) che sono molto fragili e sono un incubo di manutenzione, l'obiettivo di questi test è di sostituire principalmente i test di regressione manuale. Scrivere più test mantenibili è un must, ma ad un livello più alto non sono sicuro che i nostri test siano quelli giusti.

Ad esempio, data un'applicazione web, diciamo che c'è un modulo per aggiungere un evento con date di inizio e fine. Come test end-to-end, possiamo confermare che puoi, in effetti, aggiungere un evento. Ma se la data di inizio è successiva alla data di fine, viene visualizzato un messaggio di errore e non penserei che il modo in cui viene gestito un errore di input utente banale appartenga a un file di funzionalità. D'altra parte, sembra esserci una strong convinzione che l'unità testata sull'interfaccia utente non ne valga la pena; al contrario, si dovrebbero eseguire test di integrazione automatici.

Quindi cosa devo fare per questo codice?

Eseguo un test unitario dei componenti relativi ai messaggi di errore in generale, così come che questo modulo sta per mostrarli e ignora l'automazione della loro effettiva apparizione? Devo fare quanto sopra e quindi automatizzare che un solo messaggio di errore da qualche parte mostri come previsto, e supponiamo che il resto funzionerà? Cerco di automatizzare ogni potenziale caso di errore diverso per ogni modulo?

Colpisce la via di mezzo dei test di integrazione, di cui sono diffidente. In base alla mia esperienza, il mantenimento di un gran numero di test di integrazione non sembra valere il valore. D'altra parte, c'è funzionalità al di sopra del livello dell'unità e al di sotto del livello di funzionalità che avrei idealmente testato, sia nell'interfaccia utente che al di fuori di esso. E sono preoccupato di quale tipo di sicurezza regredisca la regressione automatica se non sta colpendo tutto.

Sono perfettamente disposto a scrivere test di integrazione, ma nel contesto di quando scrivere test, quali test scrivere e quanti scrivere, qual è un buon approccio per affrontare questo problema?

    
posta Kate Jo 29.04.2014 - 03:49
fonte

3 risposte

3

Tutto si riduce ad essere conveniente e pragmatico. Poiché si è incaricati di testare questo progetto, fare attenzione a non utilizzare ogni tipo di approccio di test o modificare le cose che hanno funzionato in passato, o introdurre una serie di nuovi strumenti o pratiche solo per il gusto di farlo. Non sto dicendo che questo è il tuo piano, ma volevo solo dirlo.

Se la GUI contiene molta logica, che non dovrebbe, allora deve essere testata. Idealmente la GUI contiene pochissima logica (o nessuna, ma realisticamente è difficile da fare). Se contiene molta logica, vedere se è fattibile o meno per rifattorizzare il codice GUI rispetto alla creazione e al mantenimento di un'ampia base di test lenti della GUI. Se la GUI contiene poca o nessuna logica, allora si può forse fare a meno di non testarla affatto, o pochissimi test di base per assicurarsi che le "connessioni" siano tutte buone, come menzionato sopra. Inoltre, poiché ce ne sono solo pochi, non devi preoccuparti delle loro prestazioni e il sovraccarico di manutenzione non è così elevato.

Dovresti comunque testare l'integrazione del resto del tuo sistema (tutto eccezione della GUI), comunque. Il sistema dovrebbe essere progettato in modo tale da non richiedere una GUI per guidarlo, potrebbe essere un'interfaccia a linea di comando (automatizzata), un'interfaccia web service, ecc.

Dovrebbe esserci il maggior numero di test unitari, quindi un numero minore di questi test di integrazione "core" e pochissimi test GUI di grandi dimensioni.

    
risposta data 03.05.2014 - 06:21
fonte
0

Fai BDD. Scrivi test di accettazione per definire gli scenari importanti del sistema. Avrai la maggior parte dei test di integrazione di cui hai bisogno, oltre a una preziosa documentazione e la prova che il tuo sistema fa esattamente quello che dovrebbe.

Quindi aggiungi i test di integrazione in modo da avere una buona copertura di integrazione. (Il commento di BobDalgleish è un buon modo di pensare alla copertura dell'integrazione.) Di solito trovo che la copertura di integrazione mancante mi aiuti a trovare i test di accettazione mancanti.

Quindi aggiungere test unitari per specificare i dettagli di comportamento e correttezza tecnica. Non dovrai affatto testare un po 'di codice, perché sarà già testato dai test di accettazione / integrazione. Penserai a cose da testare in un altro codice e potresti anche voler ripetere i percorsi attraverso quel codice che sono già stati testati nei test di accettazione / integrazione in modo che i test unitari abbiano senso senza leggere i test di integrazione.

    
risposta data 09.05.2014 - 05:09
fonte
0

Tendo a pensare che dovresti iniziare dal basso e lavorare, in termini di test. Test unitari prima: i pezzi più piccoli e granulari. Senza di loro, il resto dei test non ha davvero molto di un fondamento sotto di loro.

I test di integrazione verranno dopo. Gestire i test di integrazione prima dell'interfaccia utente / UAT. Questi possono essere scritti quasi come test unitari, ma classificati in modo diverso (in modo tale che il test eseguito possa eseguire test unitari di feedback rapido senza test di integrazione, o viceversa, o entrambi insieme).

In genere i test di unità sono veloci e vengono eseguiti ogni volta che viene eseguito il commit di un commit. I test di integrazione sarebbero un tipo di rilascio preliminare. UI / UAT arriva per ultimo.

Per scegliere il tuo specifico "data di inizio non deve essere successiva alla data di fine", ad esempio, penso che questo dovrebbe essere sicuramente un test unitario. Non richiede altri componenti di integrazione per testarlo. Tuttavia, "assicurati che la voce scriva sul database", ad esempio, sarebbe un test di integrazione.

Penso che, per impostazione predefinita, il / i livello / i logico dominio / business di un progetto ottenga molto più copertura di test unitaria rispetto, ad esempio, a un livello MVC. I test unitari più importanti vengono eseguiti contro l'accesso aziendale, IMO. Il test di integrazione è in realtà il punto in cui unisci il livello MVC e, ad esempio, il livello dominio / BL e il livello di accesso ai dati per assicurarti che tutto funzioni correttamente.

In quanto tale, è importante che l'architettura di base del sistema sia corretta. L'oggetto aziendale dovrebbe essere la convalida, ad esempio, che la data di inizio non è successiva alla data di fine. Questo diventa quindi molto naturale per i test unitari, dato che i test unitari tendono a colpire duramente il livello del dominio, ma non tanto sul livello MVC. (ovviamente, il livello MVC potrebbe / dovrebbe verificare ciò prima che arrivi veramente al dominio, ma è una cosa piacevole, non una necessità).

Quindi, con tutto ciò che detto, di solito farò qualcosa del tipo:

Project.Domain
Project.Domain.Tests.Unit
Project.WebApp
Project.WebApp.Tests.Unit
Project.WebApp.Tests.Integration

I test di integrazione sono più o meno gli stessi, ma viene data la categorizzazione che i tuoi runner di test possono utilizzare per eseguire solo unità, o unità e integrazione insieme, ecc.

Alcune cose nel progetto WebApp potrebbero ancora essere sottoposte a test dell'unità: i controller per assicurarsi che stiano eseguendo correttamente il JSON, ecc, ma in generale il test dell'unità tende a ottenere il più grande successo per il livello di dominio, e rispettivamente integrazione ai livelli di presentazione / dati.

E una volta che tutto è a posto, avvolgere tutto con alcuni test UAT / UI è anche bello!

    
risposta data 08.03.2017 - 16:30
fonte

Leggi altre domande sui tag