2009-02-17 12 views
35

Lavoro in un ufficio che da tempo fa Agile. Usiamo Scrum per la gestione dei progetti e integriamo le pratiche ingegneristiche di XP. Funziona bene e stiamo imparando costantemente le lezioni e perfezionando il nostro processo.The Agile Way: test di integrazione o test funzionale o entrambi?

Vorrei raccontarvi le nostre pratiche abituali per i test e ottenere un feedback su come questo potrebbe essere migliorato:

TDD: prima linea di difesa Siamo abbastanza religioso di test di unità e direi anche i nostri sviluppatori hanno esperienza sufficiente per scrivere test completi e isolare sempre il SUT con i mock.

Integration Test per il nostro uso, test di integrazione sono fondamentalmente lo stesso come i test di unità solo senza utilizzare i schernisce. Questo tende a cogliere alcuni problemi che sono sfuggiti ai test unitari. Questi test tendono a essere difficili da leggere poiché di solito richiedono molto o lavorano nelle sezioni before_each e after_each del framework delle specifiche poiché il sistema deve spesso raggiungere un determinato stato affinché i test siano significativi.

Test funzionali Generalmente lo facciamo in modo strutturato ma manuale. Abbiamo suonato con Selenium e Windmill, che sono fantastici, ma per noi almeno non ancora del tutto.

Mi piacerebbe sentire come qualcun altro sta facendo le cose. Pensi che se i test di integrazione oi test funzionali vengono eseguiti abbastanza bene, l'altro può essere ignorato?

risposta

24

unità, integrazione e test funzionali, anche se l'esercizio del medesimo codice, stanno attaccando da diverse prospettive.Sono queste le prospettive che fanno la differenza, se dovessi abbandonare un tipo di test allora qualcosa potrebbe farcela da quell'angolo.

Inoltre, il test delle unità non riguarda realmente il test del codice, soprattutto se si sta praticando TDD. Il processo di TDD helps you design your code better, si ottiene solo il bonus aggiuntivo di una serie di test alla fine di esso.

Non è stato specificato se è in esecuzione un server di integrazione continua. Consiglio vivamente di crearne uno (Hudson è facile da configurare). Quindi è possibile eseguire i test di integrazione e funzionali per ogni verifica del codice.

4

Test di unità, test di integrazione e test funzionali hanno tutti scopi diversi. Non dovresti scartarne uno solo perché gli altri funzionano con un alto livello di affidabilità.

4

Direi (e questa è solo una questione di opinione) che i tuoi test funzionali sono i tuoi veri test . Cioè quei test che effettivamente simulano l'uso reale della vostra applicazione. Per questo motivo, non sbarazzarsi di loro, non importa cosa.

Sembra che tu abbia un sistema decente in corso. Mantieni tutto se non hai nulla da perdere.

5

Abbiamo sperimentato che un insieme solido di test di selenio in realtà riassume ciò che il cliente si aspetta di qualità davvero bene. Quindi, in sostanza che abbiamo avuto questa discussione: se scrivere test di selenio era facile come scrivere unit test che dovrebbe concentrarsi meno sui test di unità.

E se lo è un errore da qualche parte che non ha alcuna conseguenza nell'applicazione, a chi importa davvero? Ma ci sono sempre i problemi che circondano le complessità della vita reale; sei sicuro che i tuoi test funzionali catturino gli scenari corretti? Ci possono essere sottostante complessità causate da altri sistemi che non sono direttamente visibili nel comportamento dell'applicazione.

In realtà, la scrittura di test di selenio (utilizzando un linguaggio di programmazione corretto, non selenese) fa diventa davvero semplice e divertente una volta analizzati i problemi iniziali. Ma non siamo disposti a rinunciare ai nostri test di unità abbastanza ancora ....

+0

automatizzate i test di selenio in modo che possano essere utilizzati per l'integrazione continua o vengono eseguiti manualmente? – ChrisInCambo

+1

li eseguiamo in modo aggressivo in CI. Tre diversi browser in esecuzione su post-commit hook – krosenvold

+1

Bello, forse è ora di tornare indietro e dargli un'altra occhiata. – ChrisInCambo

1

Tendo a non separare i vari tipi di test in TDD. Per me il TDD è lo sviluppo orientato ai test, non lo sviluppo guidato dalle unità. Quindi la mia pratica TDD combina test unitari, test di integrazione, test funzionali e di accettazione. Ciò si traduce in alcuni componenti coperti da determinati tipi di test e altri componenti sono coperti da altri tipi di test in modo molto pragmatico.

Ho chiesto uno question sulla pertinenza di questa pratica e la risposta breve è stata che in pratica la separazione è tra test rapidi/semplici eseguiti automaticamente ad ogni build e test lenti/complessi eseguiti meno spesso.

1

La mia azienda esegue test funzionali ma non unità o test di integrazione. Sto cercando di incoraggiarli ad adottarli, li vedo come un incoraggiante design migliore e un'indicazione più veloce che tutto va bene. Hai bisogno di test unitari se esegui test funzionali?

+0

Lo fai se vuoi individuare i bug in anticipo. Inoltre, come affermato nell'articolo di Garrys sopra, la parte migliore è la possibilità di modificare il codice senza paura di rompere qualcosa altrove nella base di codice. – ChrisInCambo

3

Al mio attuale cliente non separiamo in realtà tra unit test e test di integrazione. Le entità di business sono così dipendenti dal livello di dati sottostante (usando un framework ORM homegrown) che in effetti abbiamo pochi o nessun vero test unitario.

Il server di build è impostato con integrazione continua (CI) in Team costruire e mantenere questo da bogging troppo con test lenti (la suite di test completa richiede più di un'ora per l'esecuzione sul server) abbiamo separato i test in test "lenti" che vengono eseguiti due volte al giorno e test "veloci" che vengono eseguiti come parte dell'integrazione continua. Impostando un attributo sul metodo di prova, il build-server può dire la differenza tra i due.

In generale, i test "lenti" sono quelli che devono eseguire l'accesso ai dati, utilizzare servizi Web o simili. Questi sarebbero considerati test di integrazione o test funzionali secondo la convenzione comune. Esempi sono: test CRUD, test di regole di validazione aziendale che richiedono un insieme di oggetti con cui lavorare, ecc.

I test "veloci" sono più come test unitari, in cui è possibile isolare ragionevolmente lo stato e il comportamento di un singolo oggetto per il test.

Considererei qualsiasi test eseguito in decimi di secondo o meno per essere "veloce". Qualsiasi altra cosa è lenta e probabilmente non dovrebbe essere eseguita come parte di CI.

Sono d'accordo sul fatto che non si dovrebbe rimanere troppo attaccati al "sapore" del test che si utilizza come parte dello sviluppo (esprimendo i criteri di accettazione poiché i test sono ovviamente l'eccezione). Il singolo sviluppatore dovrebbe usare il proprio giudizio nel decidere quale tipo di test si adatta meglio al proprio codice. Insistere sui test unitari per un'entità commerciale potrebbe non rivelare gli errori di un test CRUD e così via ...

0

Si consiglia di eseguire tutte queste operazioni poiché l'unità, l'integrazione e i test funzionali hanno tutti scopi diversi.
mi appartiene un punto importante è che il test modo di scrittura è molto importante e TDD non è enought, BDD (comportamento driven development) dare un buon approccio ...

3

Io paragono unit testing come fare in modo le parole in un paragrafo sono scritti correttamente. Il test funzionale è come assicurarsi che il paragrafo abbia senso e fluisca bene all'interno del documento in cui vive.