2015-10-07 23 views
10

Sto eseguendo test selenio sulla griglia del selenio utilizzando il plug-in Surefire per eseguire i test. In termini di analisi del mio test ho diverse classi, alcune delle quali hanno 1 test in là e alcuni più di un test.Test parallelo JUnit e Surefire - ForkCount & ThreadCount

Così sulla mia griglia ho 30 driver di Chrome Web e voglio eseguire tutti i test all'interno di tutte le classi in parallelo.

ho letto come farlo utilizzando il parametro parallel che ho impostato come:

  <plugin> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <version>2.17</version> 
       <configuration> 
        <includes> 
         <include>${testSuite}</include> 
        </includes> 
        <parallel>all</parallel> 
        <useSystemClassLoader>false</useSystemClassLoader> 
        <perCoreThreadCount>false</perCoreThreadCount> 
        <threadCount>20</threadCount> 
        <browser>${browser_type}</browser> 
       </configuration> 
      </plugin> 

Tuttavia questo doesnt sembrano riempire tutti i piloti web di Chrome che ho a disposizione.

Se Ho quindi utilizzare forkCount, come:

<forkCount>20</forkCount> 
<reuseForks>true</reuseForks> 

Poi, quando i primi si avvia l'esecuzione di test, tutti i driver web sono pieni tuttavia avvia rapidamente cadere e di comportarsi uno alla volta.

Così le mie domande:

  • Esiste una relazione tra forkCount e threadcount
  • C'è qualcosa aggiuntivo che devo fare per ottenere davvero questo correre in parallelo?

Grazie.

+0

Si sta utilizzando @NotThreadSafe sui tuoi test? Tutto ciò di cui hai bisogno è qui https://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html –

+0

No - non usare quello @NotThreadSafe – userMod2

+0

Gli script di selenio sono progettati per correre in parallelo? altrimenti tutte le azioni del thread avverranno nel browser singolo chrome. – parishodak

risposta

3

è necessario fornire esplicito fornitore di test JUnit:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.18.1</version> 
    <dependencies> 
     <dependency> 
      <groupId>org.apache.maven.surefire</groupId> 
      <artifactId>surefire-junit47</artifactId> 
      <version>2.18.1</version> 
     </dependency> 
    </dependencies> 
    <configuration> 
     <parallel>all</parallel> 
     <useUnlimitedThreads>true</useUnlimitedThreads> 
     <useSystemClassLoader>false</useSystemClassLoader> 
     <includes> 
      <include>${testSuite}</include> 
     </includes> 
     <systemPropertyVariables> 
      <browser>${browser_type}</browser> 
     </systemPropertyVariables> 
    </configuration> 
</plugin> 

e si dovrebbe usare JUnit 4.7+ come le versioni precedenti non funziona correttamente con i test in parallelo.

Inoltre, è possibile omettere i parametri relativi alla forcella se i test NON influiscono sul runtime JVM (in genere non è così).

Oppure migrare i test su TestNG: è un framework più elegante e funziona con test parallelo molto meglio, quindi JUnit (imo).

+0

surefire-junit47 viene selezionato automaticamente se si utilizza junit 4.8+ e si utilizza un parametro nella configurazione: http://maven.apache.org/surefire/maven-surefire-plugin/examples/junit.html#Using_JUnit_Categories – Ardesco

+0

@ Ardesco: vero/falso. vero, perché hai ragione. falso, perché OP non usa i gruppi. tuttavia la dichiarazione esplicita garantisce che verrà utilizzato il fornitore di test corretto. – ursa

+0

L'utilizzo di plug-in con plug-in non ha comportato alcuna differenza. (Sto usando jUnit 4.11) – userMod2

0

Ci sono così tante configurazioni per eseguire test in parallelo.

Secondo la documentazione:

forkCount

Il parametro forkCount definisce il numero massimo di JVM processi che infallibile spawnerà contemporaneamente per eseguire i test. Supporta la stessa sintassi di -T in maven-core: se si termina il valore con uno C, tale valore verrà moltiplicato con il numero di core CPU disponibili nel sistema. Ad esempio, forkCount=2.5C su un sistema Quad-Core risulterà in un massimo di dieci processi JVM concorrenti che eseguono test.

...

L'impostazione predefinita è forkCount=1/reuseForks=true, il che significa che infallibile crea un nuovo processo JVM per eseguire tutti i test in un unico modulo Maven.

THREADCOUNT

Quando si utilizza reuseForks=true e un valore forkCount maggiore di uno, classi di test vengono consegnati al processo biforcuta uno per uno. Pertanto, parallel=classes non cambierebbe nulla. Tuttavia, è possibile utilizzare parallel=methods: le classi vengono eseguite nei processi simultanei forkCount, ciascuno dei processi può quindi utilizzare i thread threadCount per eseguire i metodi di una classe in parallelo.

Per quanto sia comprensibile, threadCount è come una sottofilettatura per ogni forcella.

È possibile modificare questi params per migliorare le prestazioni di prova, per esempio, si può avere:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.17</version> 
    <configuration> 
     <includes> 
       <include>${testSuite}</include> 
     </includes> 
     <parallel>all</parallel> 
     <useSystemClassLoader>false</useSystemClassLoader> 
     <perCoreThreadCount>false</perCoreThreadCount> 
     <forkCount>2.0C</forkCount> 
     <reuseForks>true</reuseForks> 
     <threadCount>20</threadCount> 
     <browser>${browser_type}</browser> 
    </configuration> 
</plugin> 

è possibile trovare maggiori dettagli nel suo sito:

https://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html

+0

Ho sperimentato con questi tuttavia il problema che ho è che tutti i miei driver di cromo non vengono riempiti anche se sto lanciando abbastanza test a questo. – userMod2

+0

@ userMod2 sembra un problema con l'installazione dei casi di test e non con il modo in cui si desidera eseguirli contemporaneamente. Ad esempio, è possibile rimuovere tutto il parallelismo e verificare se i driver sono pieni, in caso contrario si ha un altro problema. Per quanto posso dire, potresti avere un problema nel metodo annotato '@ Before' o' @ BeforeClass', stai caricando il tuo driver lì? –

+0

Ho rimosso qualsiasi configurazione parallela ed è stata eseguita solo con un driver web, quindi la mia configurazione è in uso. Anche nel mio codice non ci sono metodi Before o @BeforeClass nel mio codice – userMod2