2015-10-07 7 views
10

Ich verwende Selenium-Tests auf dem Selenium Grid mit dem Surefire-Plugin, um Tests durchzuführen. In Bezug auf meine Testaufschlüsselung habe ich mehrere Klassen, von denen einige einen Test darin und einige mehr als einen Test haben.JUnit und Surefire Paralleltests - ForkCount & ThreadCount

Also auf meiner Grid habe ich 30 Chrome-Web-Treiber und ich möchte alle Tests in allen Klassen parallel ausführen.

Ich habe gelesen, wie dies die parallel Parameter verwenden zu tun, die ich als gesetzt haben:

  <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> 

Doch dies scheint nicht alle Chrome-Web-Treiber zu füllen ich zur Verfügung haben.

Wenn ich dann forkCount verwenden, wie:

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

Dann, wenn die Testausführung zum ersten Mal startet, werden alle Web-Fahrer es zu einer Zeit ein Verhalten schnell beginnt jedoch gefüllt fallen und.

Also meine Fragen:

  • Gibt es eine Beziehung zwischen forkCount und tpi
  • Gibt es etwas zusätzliche ich wirklich tun müssen, parallel diese zum Laufen zu bringen?

Danke.

+0

Verwenden Sie @NotThreadSafe auf deinen Tests? Alles, was Sie brauchen, ist hier https://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html –

+0

Nein - nicht mit dem @ NotThreadSafe – userMod2

+0

Selen-Skripte sind dafür ausgelegt parallel laufen? Andernfalls werden alle Thread-Aktionen in einem einzelnen Chrome-Browser ausgeführt. – parishodak

Antwort

3

Sie haben explizite JUnit-Testanbieter zur Verfügung zu stellen:

<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> 

Und Sie sollten JUnit verwenden 4.7+, da ältere Versionen nicht korrekt mit Parallel-Test funktioniert.

Sie können auch forkbezogene Parameter auslassen, wenn sich Ihre Tests NICHT auf die JVM-Laufzeit auswirken (normalerweise ist dies nicht der Fall).

Oder migrieren Sie Ihre Tests zu TestNG - es ist eleganter Rahmen und es funktioniert mit parallelem Testen viel besser, dann JUnit (imo).

+0

surefire-junit47 wird automatisch ausgewählt, wenn Sie junit 4.8+ verwenden und einen Parameter in Ihrer Konfiguration verwenden: http://maven.apache.org/surefire/maven-surefire-plugin/examples/junit.html#Using_JUnit_Categories – Ardesco

+0

@ Ardesco - richtig/falsch. wahr, weil du recht hast. false, weil OP keine Gruppen verwendet. Eine ausdrückliche Erklärung garantiert jedoch, dass der richtige Testanbieter verwendet wird. – ursa

+0

Die Verwendung von Abhängigkeiten mit Plugin machte keinen Unterschied. (Ich benutze jUnit 4.11) – userMod2

0

Es gibt so viele Konfigurationen, um den Test parallel auszuführen.

Nach der Dokumentation:

forkCount

Der Parameter forkCount die maximale Anzahl der JVM definiert Prozesse, dass Surefire gleichzeitig Laichen werden die Tests durchzuführen. Es unterstützt die gleiche Syntax wie -T in maven-core: Wenn Sie den Wert mit einer C beenden, wird dieser Wert mit der Anzahl der verfügbaren CPU-Kerne in Ihrem System multipliziert. Zum Beispiel führt forkCount=2.5C auf einem Quad-Core-System zu einer Verzweigung von bis zu zehn gleichzeitigen JVM-Prozessen, die Tests ausführen.

...

Die Standardeinstellung ist forkCount=1/reuseForks=true, was bedeutet, dass eine neue Surefire JVM Prozess erzeugt alle Tests in einem maven Modul auszuführen.

tpi

Wenn reuseForks=true verwenden und einen forkCount Wert größer als eins ist, Testklassen werden an dem gegabelten Prozess one-by-one übergeben. Somit würde parallel=classes nichts ändern. Sie können jedoch parallel=methods verwenden: Klassen werden in forkCount konkurrierenden Prozessen ausgeführt. Jeder der Prozesse kann dann threadCount Threads verwenden, um die Methoden einer Klasse parallel auszuführen.

So gut ich verstehe, threadCount ist wie ein Untergewinde für jede Gabel.

Sie können diese params zwicken, um Ihre Testleistung zu verbessern, zum Beispiel können Sie haben:

<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> 

Sie können weitere Informationen auf seiner Website finden:

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

+0

Ich habe mit diesen experimentiert, aber das Problem, das ich bekomme, ist, dass alle meine Chromtreiber nicht gefüllt werden, obwohl ich genug Tests darauf werfe. – userMod2

+0

@ userMod2 scheint ein Problem mit der Testfall-Einrichtung und nicht mit der Art, wie Sie sie gleichzeitig ausführen möchten. Zum Beispiel können Sie alle Parallelität entfernen und überprüfen, ob Ihre Treiber voll sind, andernfalls haben Sie ein anderes Problem. Soweit ich das beurteilen kann, haben Sie möglicherweise ein Problem mit Ihrer annotierten Methode '@ Before' oder' @ BeforeClass'. Laden Sie Ihren Treiber dort? –

+0

Ich habe jede parallele Konfiguration entfernt und es lief nur in einem Web-Treiber, so dass meine Konfiguration verwendet wird. Auch gibt es keine Before oder @BeforeClass Methoden in meinem Code überhaupt – userMod2