2011-09-01 1 views
30

In questo post, ho fatto una piccola domanda come parte di un problema più grande. Poiché non ho ancora ricevuto le risposte, ho posto la mia domanda qui:JUnit esegue i test case in sequenza?

È ragionevole supporre che JUnit esegua i casi di test in sequenza: un caso di test termina prima che inizi il successivo. Differisce tra le versioni di JUnit (la mia priorità è su JUnit4)? E se no, c'è un modo semplice per forzare JUnit ad eseguire i test in sequenza?

Grazie

+0

Come nota a margine, ecco alcune informazioni su esecuzione di test in parallelo utilizzando JUnit 4.7: http: // StackOverflow.it/questions/423627/running-junit-tests-in-parallel – mort

+0

Se si utilizza JUnit all'interno della build Maven, e la build è impostata per essere multi-threaded usando il parametro -T, (es. -T 4C), quindi i test verranno eseguiti parallelamente ove possibile –

risposta

23

Sì, per impostazione predefinita credo che esegue i test in sequenza.

JUnit 4.6 ha introdotto una sperimentale ParallelRunner per eseguire test in parallelo - Non so il suo stato attuale. Mi aspetterei che il parallelismo rimanga una funzionalità "opt-in" di default. (A giudicare da altre risposte, sembra che ora sia qui per rimanere ma in una forma leggermente diversa - e ancora opt-in.)

+0

@FDinoff: Sì, sembra che le 4,6 note di rilascio siano difficili da trovare ora. Ho rimosso il collegamento. –

+0

Generalmente è meglio eseguire i test in parallelo anziché in sequenza? Che tipo di hardware dobbiamo avere per eseguire test in parallelo? – testerjoe2

+0

Questo sembra un modo accettabile per confermare la sequenza diversa dal debug? Creare una classe di test con 10 metodi di test. Creare un elenco di numeri interi nella classe di test. Ogni metodo di prova immette la sua posizione in classe nella lista. Esegui tutti i test 10 volte. Ogni volta, i numeri interi devono sempre essere nell'ordine corretto. – testerjoe2

4

Un'indovina forte e ragionevole: sì, JUnit è single threaded di default.

Altrimenti uno non sapere se un test è fallito perché il codice è rotto o non è riuscito a causa di problemi di concorrenza se alcuni test correva in parallelo.

+0

Se ogni test utilizza i propri dati di test (non sempre possibile), allora è meglio eseguire i test in parallelo? – testerjoe2

15

esecuzione parallela di prove è supportato dal JUnit 4.7. Ma per quanto ne so, non viene mai fatto automaticamente, è specificamente necessario configurarlo, ad es. come qui: http://java.dzone.com/articles/running-junit-tests-parallel

Ma non dimenticate che:

buoni test automatici dovrebbero essere indipendenti, isolata e riproducibili, che li rende i candidati ideali per essere eseguiti contemporaneamente.

Non so perché lo chiedi, ma se i criteri di cui sopra non sono soddisfatti, potresti voler pensare al tuo progetto di test.

+0

"I buoni test automatizzati devono essere indipendenti, isolati e riproducibili" - Possiamo ottenere questo risultato disponendo di dati di test separati per ciascun test, a patto che il processo di creazione dei dati di test non richieda troppo tempo e risorse? – testerjoe2

3

Sì,

E anche pensare al @before e @after ci si può avere il codice che ripristina lo stato per il prossimo test per l'esecuzione.

+0

puoi spiegarci un po 'di più? – testerjoe2

1

Sì. Come menzionato da qualche parte nei commenti, dovresti pianificare attentamente l'impostazione e il teardown del testcase (tutte le superclassi influiscono su tali azioni), così come l'installazione e il teardown di testsuite.

Inoltre, su una nota secondaria, per quanto posso ricordare, JUnit non garantisce l'ordine di esecuzione dei test (cioè, a meno che non siano in una suite, immagino). Questo è importante, e dovrebbe spingerti a eseguire un cleanup accurato e il ripristino dello stato SUT tra i test, ed evitare casi di test basati sui risultati di altri test. potresti dire che questa è una specie di antipattern :).

-1

Con la mia esperienza posso dire che siamo in grado di serializzare prove in una classe nominando il nome del metodo di prova avendo in esso. es:

@Test 

public ..... firstTest() 
{ 

} 

@Test 

public .... thirdTest() 
{ 

} 

@Test 

public....secondTest() 
{ 

} 

L'ordine è firstTest, thirdTest, secondTest