Domanda

Mi chiedo se il Maven Surefire plug o esegue test multi-threaded di default (e in tal caso può il numero di thread essere controllato?) O se si esegue test delle classi di prova in ordine casuale o di ordine prevedibile, o se l'ordine può dettato da alcuni mezzi.

Non ho ancora verificato questo (lo farò così domani solo in cerca di qualche testa a testa di guida e di verifica a questo punto), ma sembra come se le mie varie classi JUnit test sono sempre i test eseguiti in qualche ordine mescolati . Che lo rende un vero e proprio dolore per orchestrare la creazione delle risorse di test (che sono abbastanza pesante nel mio caso).

La sua probabilmente un classico problema corro la mia suite con JUnit corridore Eclipse e tutto funziona molto lineare e gioca piacevole. Vado a Maven linea di cmd e le cose sembra essere un passo in tutto l'altro.

È stato utile?

Soluzione

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

Se si utilizza TestNG o Junit 4.7+ (dal SUREFIRE-555 ), è possibile eseguire i test in parallelo (vedere la parallel e la threadCount parametri opzionali), ma questo non è un default.

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")); 

Si tuttavia consiglia vivamente di non dipendere da ordine di esecuzione di test, test di unità in realtà dovrebbe essere davvero indipendenti.

PS: Solo nel caso, c'è anche questa richiesta SUREFIRE-321 (a eseguire i test in ordine alfabetico) che si potrebbe desiderare di votare.

Altri suggerimenti

Prima di tutto, il test di unità dovrebbe essere indipendenti l'uno dall'altro . Questo perché l'ordine di esecuzione non è garantito anche dalla JUnit, così ogni prova deve impostare e abbattere suo contesto (alias apparecchiatura di prova) indipendente 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 a costruire su di essa - si può cambiare in qualsiasi momento, e apparentemente in Surefire l'ordine è diverso.

Ecco un buon collegamento sul perché interagire test non sono una buona idea.

JUnit esegue test nell'ordine in cui appaiono nel file .java (non in ordine alfabetico). Maven-infallibile li esegue in un ordine diverso, ma non prevedibile (per quanto posso dire).

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

sempre

Ho scoperto che se si utilizza l'opzione -T nel comando Maven, infallibile sarà poi forchetta numero forkCount * <specified number of threads by the -T option> 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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top