2016-01-07 7 views
9

Mit dem Ziel, unsere Build-Zeiten zu verwalten/zu reduzieren, möchte ich herausfinden, welche Unit-Tests die meiste Zeit beanspruchen - in einer parallelen Testumgebung mit der maven-surefire-plugin.Wie erkenne ich langsame Komponententests, wenn maven-surefire-plugin im Parallelmodus verwendet wird?

Wir verwenden JUnit (4.10) für Komponententests. Wir verwenden maven (2.2.1 - einige Plugins, die wir verwenden, unterstützen Maven 3 noch nicht) als primäres Build-Tool und maven-surefire-plugin (2.19), um Unit-Tests auszuführen.

Wir verwenden die maven-surefire-plugin in parallel mode, wo beide die einzelnen Methoden parallel ausgeführt werden und die Unit-Test-Klassen parallel ausgeführt werden - das ist sehr wichtig, da es die Testzeit der Build-Unit erheblich reduziert. Die maven-surefire-plugin ist im .pom wie folgt konfiguriert:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.19</version> 
    <configuration> 
     <argLine>-Xmx2G -XX:MaxPermSize=1G -XX:-UseSplitVerifier</argLine> 
     <failIfNoTests>false</failIfNoTests> 
     <parallel>classesAndMethods</parallel> 
     <useUnlimitedThreads>true</useUnlimitedThreads> 
    </configuration> 
    </plugin> 

jedoch eine der Folgen davon ist, daß in der Konsole Ausgang, die Zeit für jede JUnit Testklasse vergangen ist die Gesamtzeit für alle Methoden in dem Klasse. Wenn eine Testklasse beispielsweise über 10 Komponententestmethoden verfügt, von denen jede 1 Sekunde zum Ausführen benötigt, würde die Testklasse etwa 1 Sekunde dauern (jede Methode wird parallel ausgeführt), aber die Ausgabe würde dies erfordern so etwas wie:

Lauf com.package.QuickParallelTest Tests ausführen: 10, Fehler: 0, Fehler: 0, Skipped: 0, verstrichene Zeit: 10,0 sec - in com.package.QuickParallelTest

Dies macht es schwierig, in der Konsolenausgabe von einer anderen Testklasse mit 10 Unit-Testmethoden zu unterscheiden Ich 9 laufe fast sofort und 1 dauert fast 10 Sekunden. In diesem Fall würde die Testklasse etwa 10 Sekunden (wegen des eines langsamen Testmethode) zu laufen, aber die maven-surefire-plugin Konsolausgabe der gleich effektiv wäre:

Lauf com.package.SlowParallelTest Tests ausführen: 10, Fehler: 0, Fehler: 0, Skipped: 0, verstrichene Zeit: 10,0 sec - in com.package.SlowParallelTest

Idealerweise möchte ich die Zeit zeigen verstrichen, wie lange die Testklasse nahm zu run (parallel), nicht die Gesamtzeit, die benötigt wird, um die Methoden getrennt auszuführen (als ob single-threaded).

Also, meine Frage (n) ist/sind:

  1. Gibt es Maven-todsichere-Plugin Einstellung, die mir fehlt, so dass der Druck Zusammenfassung Zeit pro Klasse aufgenommen wurden, zeigen würde eher als Aggregat für Methoden ?
  2. Ist dies ein bekannter "Bug" (oder "Feature") in der maven-surefire-plugin? (Ich habe die SureFire JIRA überprüft, konnte aber nichts finden.)
  3. Gibt es einen alternativen Weg für mich zu identifizieren, welche Tests eine lange Zeit dauern und sind daher ideal für die Optimierung.

EDIT:

Ich habe mit einigen zusätzlichen Konfigurationseinstellungen versucht zu spielen.Seltsamerweise scheint das Hinzufügen des folgenden zu der Konfiguration in .pom die in der Konsolenausgabe verstrichene Zeit zu ändern, die für die Ausführung der Testklasse benötigte Zeit zu sein - dies ist jedoch (meiner Meinung nach) kontraintuitiv, da diese Einstellungen sind der default settings:

<configuration> 
     ... 
     <forkCount>1</forkCount> 
     <reuseForks>true</reuseForks> 
    </configuration> 
+0

Nur als Kommentar für zukünftige Leser - in einem Produktionskontext, einschließlich der Konfigurationseinstellung false, was bedeutet, dass keine Leistungsdaten auf der Konsole gedruckt werden, können Build-Zeiten verbessern - Sie können dann auskommentieren Diese Einstellung beim Erstellen der Profilerstellung. – amaidment

Antwort

10

Hinzufügen des Maven Plugin todsicheren Konfiguration den reportFormat Eintrag und seinen Wert auf plain (anstelle der Standard-brief) würden Sie Zeit pro Methode verstrichen ist.

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <version>2.19</version> 
      <configuration> 
       <argLine>-Xmx2G -XX:MaxPermSize=1G -XX:-UseSplitVerifier</argLine> 
       <failIfNoTests>false</failIfNoTests> 
       <parallel>classesAndMethods</parallel> 
       <useUnlimitedThreads>true</useUnlimitedThreads> 
       <reportFormat>plain</reportFormat> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

Ausgabe mit Standard reportFormat (brief):

------------------------------------------------------- 
T E S T S 
------------------------------------------------------- 
Running com.sample.mocking.InternalServiceTestCase 
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.241 sec - in com.sample.mocking.InternalServiceTestCase 

Ausgang mit plain Wert:

------------------------------------------------------- 
T E S T S 
------------------------------------------------------- 
Running com.sample.mocking.InternalServiceTestCase 
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.187 sec - in com.sample.mocking.InternalServiceTestCase 
test(com.sample.mocking.InternalServiceTestCase) Time elapsed: 0.005 sec 
mockTest(com.sample.mocking.InternalServiceTestCase) Time elapsed: 0.17 sec 
mockTestFailureTollerance(com.sample.mocking.InternalServiceTestCase) Time elapsed: 0.007 sec 
mockProcessfile(com.sample.mocking.InternalServiceTestCase) Time elapsed: 0.003 sec 

Diese Option Ihnen weitere Informationen zu Tests und Ausführungszeit geben kann.

+0

Danke - das ist sehr hilfreich. Ich habe diese Einstellung gesehen, habe sie aber nicht berücksichtigt, da die Dokumentation (wie du verlinkt) sagt, dass sie "nur für das Ausgabeformat der Ausgabedateien gilt". Die Verwendung dieser Einstellung war hilfreich beim Identifizieren von Einheitentest-Engpässen. Es ist jedoch kein Allheilmittel, da das Surefire-Plugin die Uhr bei jeder Methode startet, wenn es zur Ausführung gesendet wird, anstatt es zu starten. (Ich könnte mich irren, aber das ist meine Interpretation der Zeit verstrichenen Daten, die ich sehe.) – amaidment