2009-11-30 14 views
29

Che cosa si usa per scrivere test basati sui dati in jUnit?Test basati sui dati con jUnit

(La mia definizione di) un test guidato dai dati è un test che legge i dati da una fonte esterna (file, database, ...), esegue un test per riga/file/altro e visualizza i risultati in un test runner come se avessi test separati - il risultato di ogni corsa è visualizzato separatamente, non in un unico enorme aggregato.

risposta

37

In JUnit4 è possibile utilizzare il tester Parameterized per eseguire test basati sui dati.

Non è molto ben documentato, ma l'idea di base è quella di creare un metodo statico (annotato con @Parameters) che restituisce una raccolta di matrici Object. Ciascuno di questi array viene utilizzato come argomento per il costruttore della classe di test, quindi i normali metodi di test possono essere eseguiti utilizzando i campi impostati nel costruttore.

È possibile scrivere codice per leggere e analizzare un file di testo esterno nel metodo @Parameters (o ottenere dati da un'altra fonte esterna), quindi sarà possibile aggiungere nuovi test modificando questo file senza ricompilare i test.

+0

Dire che voglio passare un argomento alla classe di test dal metodo principale in base al quale scopo di filtrare i test che voglio eseguire. Posso farlo? –

0

In genere i test basati sui dati utilizzano un piccolo componente testabile per gestire i dati. (Oggetto lettura file o oggetti fittizi) Per i database e le risorse al di fuori delle applicazioni, le simulazioni vengono utilizzate per simulare altri sistemi. (Servizi Web e database, ecc.). In genere vedo che ci sono file di dati esterni che gestiscono i dati e l'output. In questo modo il file di dati può essere aggiunto al VCS.

4

io uso combinazione di dbUnit, jMock e JUnit 4. Poi si può etere eseguirlo come suite o separatamente

+2

Untils è una buona struttura per mettere tutto insieme. – dustmachine

+0

Vuoi dire Unitils (http://www.unitils.org/)? Sembra interessante, anzi, grazie per il suggerimento! – Bostone

0

Attualmente abbiamo un file di oggetti di scena con i nostri numeri ID in esso. Questo è terribilmente fragile, ma è facile ottenere qualcosa andando. Il nostro piano è di avere inizialmente questi numeri ID sovrascrivibili dalle proprietà -D nei nostri build di formiche.

Il nostro ambiente utilizza un DB legacy con dati orribilmente intrecciati che non è caricabile prima di un'esecuzione (ad esempio, da dbUnit). Alla fine vorremmo arrivare a dove un test unitario richiederebbe al DB di trovare un ID con la proprietà sottoposta a test, quindi utilizzare quell'ID nel test unitario. Sarebbe lento ed è più propriamente chiamato test di integrazione, non "test di unità", ma verificheremo contro dati reali per evitare la situazione in cui la nostra app funziona perfettamente contro i dati dei test, ma fallisce con i dati reali.

8

Uso un database in memoria come hsqldb in modo che sia possibile pre-compilare il database con un set di dati di tipo "produzione" oppure posso iniziare con un database hsqldb vuoto e popolarlo con le righe che è necessario eseguire i miei test. Oltre a questo scriverò i miei test usando JUnit e Mockito.

+2

Non sei sicuro del motivo per cui non hai votato questa risposta. È certamente un approccio valido. – serg10

0

Alcuni test si prestano ad essere interfacciati.

Se le letture del database/file vengono recuperate da una chiamata di interfaccia, è sufficiente ottenere il test dell'unità per implementare l'interfaccia e la classe di test dell'unità può restituire qualsiasi dato desiderato.

1

Sono con @ DroidIn.net, questo è esattamente quello che sto facendo, tuttavia per rispondere alla tua domanda letteralmente "e visualizza i risultati in un corridore di prova come se avessi test separati", devi guardare il JUnit4 Corridore parametrizzato. DBUnit non lo fa. Se devi fare molto, onestamente TestNG è più flessibile, ma puoi farlo in JUnit.

Si può anche guardare al runner di Teorie JUnit, ma il mio ricordo è che non è ottimo per i dataset basati sui dati, il che ha senso perché JUnit non sta lavorando con grandi quantità di dati esterni.

9

Qui è dove TestNG, con la sua @DataSource, brilla. Questa è una delle ragioni per cui preferisco JUnit; gli altri sono dipendenze e test di thread paralleli.

+0

+1 è esattamente quello che avrei scritto :-) – Davide

+0

Sette anni dopo ho cambiato idea; Tendo a restare con JUnit. I test parametrizzati sono utili. – duffymo

1

Anche se questo è un argomento piuttosto vecchio, ho comunque pensato di contribuire con la mia parte. Ritengo che il supporto di JUnit per i test basati sui dati sia sempre meno ostile. per es. per poter utilizzare i parametri, dobbiamo scrivere il nostro costruttore. Con il runner di Teorie non abbiamo il controllo sul set di dati di test che viene passato al metodo di test.

Non ci sono altri inconvenienti come individuate in questa serie post del blog: http://www.kumaranuj.com/2012/08/junits-parameterized-runner-and-data.html

V'è ora una soluzione completa venendo abbastanza bene in forma di EasyTest che è quadro aa esteso di JUnit e ha lo scopo di dare un molte funzionalità per i suoi utenti. Il suo obiettivo principale è eseguire test basati sui dati utilizzando JUnit, sebbene non sia più necessario dipendere da JUnit. Ecco il progetto github per refernece: https://github.com/anujgandharv/easytest

Se qualcuno è interessato a contribuire con i loro pensieri/codice/suggerimenti, questo è il momento. Puoi semplicemente andare al repository github e creare problemi.

2

È meglio estendere TestCase con un "DataDrivenTestCase" adatto alle proprie esigenze. Ecco un esempio funzionante: http://mrlalonde.blogspot.ca/2012/08/data-driven-tests-with-junit.html

A differenza dei test parametrizzati, consente casi di test ben definiti.

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. –

+0

@ Mathieu. questa è roba calda. i quadri di prova vanno e vengono, ma questo è solido come la roccia anche con la semplice vecchia junit. Grazie mille! – Bastl