2009-12-17 5 views
28

Ich arbeite derzeit an einem Java-Projekt mit Maven. Wir verwenden das Maven-Surefire-Plugin, um unsere Junit-Suite als Teil des Build-Prozesses auszuführen.Gibt es eine Möglichkeit, für junit mit dem maven todsichere Plugin "failfast" zu sein?

Unsere Testsuite wächst rasant, sowohl in der Abdeckung als auch in der Ausführungszeit. Die Ausführungszeit ist sehr frustrierend und zeitaufwendig, wenn Sie zehn Minuten warten müssen, um herauszufinden, dass ein Test in der ersten Testminute fehlgeschlagen ist.

Ich möchte einen Weg finden, um den Build-Prozess nach dem ersten Fehler/Fehler in der Testsuite fehlschlagen zu lassen. Ich weiß, dass dies für andere Build-Tools möglich ist, aber ich konnte keinen Weg finden, dies mit Maven todsicher zu tun.

Ich weiß, dass es in der todsicheren jira an unresolved ticket for this functionality gibt, aber ich hoffe, dass es dafür eine vorhandene Lösung gibt.

+0

Ich habe Angst, dass die Antwort ist wahrscheinlich "Nein, es ist nicht." – BryanD

Antwort

20

Stand: 6. September 2015 it appears there is, -Dsurefire.skipAfterFailureCount=1.

Ab dem 19. Oktober 2015 version 2.19 has been released.

+0

Super! Danke für die Rückmeldung, um diese Antwort zu geben! –

+0

2,19 wurde relaased –

+0

@Alexey danke, editted. –

13

Soweit ich weiß, keine, und das erfordert wirklich die Auflösung von SUREFIRE-580. Wenn Sie das schneller machen wollen, sollten Sie zumindest für das Problem abstimmen und optional einen Patch absenden;)

+2

Es ist jetzt gelöst! –

0

Das löst die Frage nicht genau, aber die Lösung, die mein Arbeitsplatz letztlich hatte, war um Atlassian's Clover zu benutzen, um spezielle Builds von Tests zu erstellen, die sich auf den geänderten Code beziehen.

Wir haben einen Clover-Build, der die Tests für den geänderten Code ausführt und wiederum den vollständigen Testaufbau startet.

Dies hat sich als zufriedenstellende Lösung erwiesen.

1

ein paar Möglichkeiten, es zu beschleunigen, wenn nicht genau das, was Sie brauchen:

  • Wenn es ein Multi-Modul zu bauen ist, fügen Sie --fail-schnell an die Befehlszeile nach dem ersten Modul zum Abfallen .

  • Schauen Sie in Failsafe zu lange laufenden Integrationstests auf eine unterschiedliche Phase des Lebenszyklus .

  • Schauen Sie in eine profilbasierte Lösung für schnelle und langsame Tests - Is there a way to tell surefire to skip tests in a certain package?.

9

Es kann eine geeignete Abhilfe, aber es hängt von Ihren Anforderungen und Sie brauchen einen CI-Server zu verwenden, die JVM-Prozess Rückgabecodes verarbeiten kann.

Die Grundidee besteht darin, Mavens JVM-Prozess vollständig zu stoppen und dem Betriebssystem mitzuteilen, dass der Prozess unerwartet gestoppt wurde. Dann sollte ein Continuous Integration Server wie Jenkins/Hudson in der Lage sein, nach einem Nicht-Null-Exit-Code zu suchen und Sie wissen zu lassen, dass ein Test fehlgeschlagen ist.

Der erste Schritt besteht darin, die JVM beim ersten Testfehler zu verlassen. Sie können das tun mit JUnit 4.7 oder höher durch Verwendung eines benutzerdefinierten RunListener (Put es in src/test/java):

package org.example 
import org.junit.runner.notification.Failure; 
import org.junit.runner.notification.RunListener; 
public class FailFastListener extends RunListener { 
     public void testFailure(Failure failure) throws Exception { 
       System.err.println("FAILURE: " + failure); 
       System.exit(-1); 
     } 
} 

Dann müssen Sie diese Klasse so konfigurieren, todsichere es mit dem JUnit 4 Runner registrieren wird .Bearbeiten Sie Ihre pom.xml und fügen Sie dem maven-surefire-plugin die Konfigurationseigenschaft listener hinzu. Sie müssen auch konfigurieren, um einen neuen JVM-Prozess für die Ausführung der Tests nicht zu verzweigen. Sonst wird es nur mit den nächsten Testfällen weitergehen.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.10</version> 
    <configuration> 
     <forkMode>never</forkMode> 
     <properties> 
      <property> 
       <name>listener</name> 
       <value>org.example.FailFastListener</value> 
      </property> 
     </properties> 
    </configuration> 
</plugin> 

Wenn dies nicht hilft, würde ich versuchen, das Maven todsichere junit Anbieter Plugin gabeln.

BTW, Unit Tests, per Definition, sollte schneller als 0,1 Sekunden laufen. Wenn Ihr Build aufgrund der Komponententests wirklich so lange dauert, müssen Sie sie in Zukunft schneller ausführen.

+1

ausgezeichnete Lösung. Btw, es sieht aus wie die nie Einschränkung kann durch Ausführen von Maven mit der Option -ff entspannt werden. Nach System.exit() wird todefire sofort den Build mit einer Nachricht "goal org.apache.maven.plugins: maven-surefire-plugin: 2.16: test failed: Die gegabelte VM beendet ohne richtig zu sagen auf Wiedersehen. VM Crash oder System. Ausgang genannt? " –

0

Dies ist keine direkte Antwort auf die Frage, aber es kann auch nützlich sein, die Ausgabe von maven über grep zu füttern, um die meisten Sachen zu entfernen und Ihnen zu helfen, um zu sehen, wo die Testfehler sind.

So:

mvn test | grep -w 'Running\|Tests' 

Welche Ausgang (für meinen Code) wie folgt erzeugt:

Running scot.mygov.pp.test.dashboard.DashboardJsonSerDesCRUDTest 
Tests run: 26, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.029 sec 
Running scot.mygov.pp.test.dashboard.DashboardBaselineCRUDTest 
Tests run: 26, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.026 sec 
Running scot.mygov.pp.test.dashboard.DashboardDatabaseValidationTest 
Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.264 sec 
Running scot.mygov.pp.test.dashboard.DashboardServiceWebServiceIsolationCRUDTest 
Tests run: 26, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.032 sec 

Viel einfacher zu sehen, wo der erste Fehler des Scheiterns.