2010-02-18 6 views
16

Mi chiedo se il plugin Maven surefire esegue test multi-thread predefiniti (e in tal caso è possibile controllare il numero di thread?) O se esegue test dalle classi Test in un ordine casuale o prevedibile, oppure se l'ordine può essere dettato in qualche modo.Il plugin Maven surefire esegue test utilizzando più thread?

Non l'ho ancora verificato (lo farò domani solo cercando qualche consiglio di guida e verifica a questo punto), ma sembra come se le mie varie classi di JUnit Test stessero eseguendo i test in alcuni casi combinati ordine. Il che rende molto difficile orchestrare la creazione delle risorse di test (che sono piuttosto pesanti nel mio caso).

Probabilmente è un problema classico. Eseguo la mia suite con il runner Eclipse JUnit e tutto è molto lineare e piacevole. Vado alla linea di cmd di Maven e le cose sembrano essere l'una per l'altra.

risposta

13

Per impostazione predefinita, Maven esegue i test in un processo separato ("forked"), niente di più (questo può essere controllato utilizzando il parametro opzionale).

Se si utilizza TestNG o Junit 4.7+ (dal SUREFIRE-555 ), è possibile eseguire i test in parallelo (vedi parallel e le threadCount parametri opzionali), ma che non è un difetto.

Ora, mentre io non sono sicuro se il plugin infallibile si comporta come JUnit, è possibile ottenere un certo controllo creando manualmente un TestSuite e specificare l'ordine in cui vengono eseguiti i test:

TestSuite suite= new TestSuite(); 
suite.addTest(new MathTest("testAdd")); 
suite.addTest(new MathTest("testDivideByZero")); 

Tuttavia, si consiglia vivamente di non dipendere dall'ordine di esecuzione del test, in realtà i test di unità dovrebbero essere effettivamente indipendenti.

P.S .: Nel caso, c'è anche questa richiesta SUREFIRE-321 (per eseguire test in ordine alfabetico) per cui si potrebbe voler votare.

+0

Ciao, consapevole di evitare test interattivi, cercando di arrivarci ... Votato per entrambi i problemi. Sembra che 555 sia ora parte della versione 2.5 http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-surefire-plugin/2.5/. – harschware

+0

utilizza la versione 2.4.2 o successiva del plugin surefire nel caso in cui non desideri affrontare problemi relativi a OOM –

3

Prima di tutto, i test dell'unità devono essere indipendenti l'uno dall'altro. Questo perché l'ordine di esecuzione non è garantito nemmeno da JUnit, quindi ogni test dovrebbe impostare e distruggere il suo contesto (ovvero il dispositivo di test) indipendentemente da ciò che accade prima o dopo.

L'ordine di esecuzione non è sicuramente casuale, però, in JUnit tende ad essere lo stesso (direi ordine alfabetico), ma non dovrebbe costruire su di esso - si può cambiare in qualsiasi momento, e apparentemente in Surefire il l'ordine è diverso

Ecco un buon collegamento sul motivo per cui interacting tests non è una buona idea.

+0

Ciao, consapevoli di evitare test interattivi, cercando per arrivarci ... grazie per il consiglio e il link. – harschware

2

JUnit esegue i test nell'ordine in cui compaiono nel file .java (non in ordine alfabetico). Maven-surefire li esegue in un ordine diverso, ma non prevedibilmente (per quanto posso dire).

Idealmente, i test sarebbero indipendenti l'uno dall'altro, ma i singleton e il contesto statico possono complicare le cose. Un modo utile per ottenere nuovi contesti statici tra le esecuzioni di TestCase separati (ma non i singoli test) è impostare la variabile forkMode nel tuo pom.xml ..

<forkMode> sempre </forkMode >

0

Ho scoperto che se si utilizza l'opzione -T nel comando Maven, infallibile sarà poi biforcarsi in forkCount * <specified number of threads by the -T option> numero di processi concorrenti.

per renderli tutti corrono in un unico processo, pur avendo più thread specificate da -T, è possibile forzare forkCount essere 0 aggiungendo l'opzione -Dsurefire.forkCount = 0