2017-02-06 6 views
0

Ich arbeite an Maven-Projekt mit Tausenden von Tests, die sehr langsam laufen (dauert 2h, um alle Tests auszuführen). Also habe ich versucht, durch die Konfiguration todsichere Plugin wie folgt die Tests parallel laufen zu lassen:Wie kann man todsichere Tests parallel ausführen, während einige nacheinander ausgeführt werden?

<configuration> 
    <failIfNoTests>false</failIfNoTests> 
    <reuseForks>false</reuseForks> 
    <reuseForks>true</reuseForks> 
    <forkCount>2C</forkCount> 
    <systemPropertyVariables> 
    <jacoco-agent.destfile>target/jacoco.exec</jacoco-agent.destfile> 
    </systemPropertyVariables> 
    <parallel>suites</parallel> 
    <threadCount>12</threadCount> 
</configuration> 

Aber dann einige der Tests fehlschlagen in ihren @Before und @After Methoden, bei denen wir initialisieren und einige Ressourcen aufzuräumen (es scheint verwandt zu sein Ports Konflikte).

Ich habe versucht, diese Annotation @net.jcip.annotations.NotThreadSafe zu den fehlgeschlagenen Tests wie in surefire documentation beschrieben, um sie nacheinander auszuführen und Konflikte zu vermeiden. Das hat aber nicht funktioniert und diese Tests scheitern immer noch !!!

Beliebiger Zeiger auf, wie einige todsichere Tests gezwungen werden, sequenziell auf demselben JVM-Prozess und demselben Thread auszuführen, während der Rest parallel ausgeführt wird (möglicherweise in verschiedenen JVM-Prozessen)?

EDIT 1 Jetzt habe ich versucht, die Konfiguration von todsicheren in zwei zu teilen: eine für sequentielle Tests und eine andere für parallele Tests. Dieser Ansatz scheint jedoch die Ausführungszeit nicht zu verbessern, da ich immer noch Tests habe, die fehlschlagen, und es dauert immer noch 2 Stunden, um alle Tests durchzuführen.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>${surefire.version}</version> 
    <!-- Sequential tests --> 
    <configuration> 
    <includes>**/*Sequential.java</includes> 
    <failIfNoTests>false</failIfNoTests> 
    <reuseForks>false</reuseForks> 
    <systemPropertyVariables> 
     <jacoco-agent.destfile>target/jacoco.exec</jacoco-agent.destfile> 
    </systemPropertyVariables> 
    </configuration> 
    <executions> 
    <!-- Parallel tests --> 
    <execution> 
     <id>parallel-tests</id> 
     <phase>test</phase> 
     <goals> 
     <goal>test</goal> 
     </goals> 
     <configuration> 
     <includes>**/*.java</includes> 
     <excludes> 
      <exclude>**/*Sequential.java</exclude> 
     </excludes> 
     <failIfNoTests>false</failIfNoTests> 
     <reuseForks>true</reuseForks> 
     <forkCount>2C</forkCount> 
     <parallel>suites</parallel> 
     <threadCount>12</threadCount> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 
+0

JCIP Annotationen nur für die Dokumentation haben sie keine semantischen Auswirkungen. – xTrollxDudex

Antwort

0

Hier ist meine letzte Maven-Konfiguration ist die Tests für den Betrieb als wollte:

<plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>${surefire.version}</version> 
     <!-- Sequential tests --> 
     <configuration> 
     <failIfNoTests>false</failIfNoTests> 
     <reuseForks>false</reuseForks> 
     <systemPropertyVariables> 
      <jacoco-agent.destfile>target/jacoco.exec</jacoco-agent.destfile> 
     </systemPropertyVariables> 
     </configuration> 
     <executions> 
     <!-- Default tests --> 
     <execution> 
      <id>default-test</id> 
      <configuration> 
      <skip>true</skip> 
      </configuration> 
     </execution> 
     <!-- Parallel tests --> 
     <execution> 
      <id>parallel-tests</id> 
      <phase>test</phase> 
      <goals> 
      <goal>test</goal> 
      </goals> 
      <configuration> 
      <includes>**/*.java</includes> 
      <excludes> 
       <exclude>**/*Sequential.java</exclude> 
      </excludes> 
      <failIfNoTests>false</failIfNoTests> 
      <reuseForks>true</reuseForks> 
      <forkCount>2C</forkCount> 
      <parallel>suites</parallel> 
      <threadCount>12</threadCount> 
      </configuration> 
     </execution> 
     <!-- Sequential tests --> 
     <execution> 
      <id>sequential-tests</id> 
      <phase>test</phase> 
      <goals> 
      <goal>test</goal> 
      </goals> 
      <configuration> 
      <skip>${skip.sequential.tests}</skip> 
      <includes>**/*Sequential.java</includes> 
      <reuseForks>false</reuseForks> 
      </configuration> 
     </execution> 
     </executions> 
    </plugin> 
0

ich mit Ihrem „spalten die Konfiguration von todsicheren in zwei“ -Ansatz gehen würde.

Ihre Konfiguration scheint jedoch fehlerhaft zu sein, da Sie nur eine Ausführung definiert haben.

Könnte so etwas versuchen wollen (2 Ausführungen mit ihren eigenen Konfigurationen definieren):

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>${surefire.version}</version> 

    <executions> 
    <!-- Sequential tests --> 
    <execution> 
     <id>sequential-tests</id> 
     <phase>test</phase> 
     <goals> 
     <goal>test</goal> 
     </goals> 
     <configuration> 
     <includes>**/*Sequential.java</includes> 
     <failIfNoTests>false</failIfNoTests> 
     <reuseForks>false</reuseForks> 
     <systemPropertyVariables> 
      <jacoco-agent.destfile>target/jacoco.exec</jacoco-agent.destfile> 
     </systemPropertyVariables> 
     </configuration> 
    </execution>  
    <!-- Parallel tests --> 
    <execution> 
     <id>parallel-tests</id> 
     <phase>test</phase> 
     <goals> 
     <goal>test</goal> 
     </goals> 
     <configuration> 
     <includes>**/*.java</includes> 
     <excludes> 
      <exclude>**/*Sequential.java</exclude> 
     </excludes> 
     <failIfNoTests>false</failIfNoTests> 
     <reuseForks>true</reuseForks> 
     <forkCount>2C</forkCount> 
     <parallel>suites</parallel> 
     <threadCount>12</threadCount> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 
+0

Auch resuseForks = false wird nicht wirklich für sequenzielle Testausführungen benötigt, aber wird Ihre Tests erheblich verlangsamen, ich würde das auf true umstellen, wenn es keinen guten Grund für falsche – tom

+0

Ihre Konfiguration gibt, läuft 3 Tests Ausführungen: default-test , sequentielle Tests und Paralleltests. – bachr

+0

Wahr, Sie müssen die Standard deaktivieren, aber ich sehe, Sie haben bereits die Lösung für diese gefunden – tom

Verwandte Themen