1. Einleitung
Diese Kurzanleitung zeigt, wie Sie mit Maven ein Glas bauen, während Sie die Testergebnisse ignorieren.
Standardmäßig führt Maven beim Erstellen des Projekts automatisch Komponententests durch. Es gibt jedoch seltene Fälle, in denen die Tests übersprungen werden können und wir das Projekt unabhängig von den Testergebnissen erstellen müssen.
2. Erstellen Sie das Projekt
Erstellen wir ein einfaches Projekt, in das wir auch einen kleinen Testfall aufnehmen:
public class TestFail { @Test public void whenMessageAssigned_thenItIsNotNull() { String message = "hello there"; assertNotNull(message); } }
Erstellen wir eine JAR-Datei, indem wir den folgenden Maven-Befehl ausführen:
mvn package
Dies führt zum Kompilieren der Quellen und zum Generieren einer Datei maven-0.0.1-SNAPSHOT.jar im Verzeichnis / target.
Lassen Sie uns nun den Test ein wenig ändern, damit der Test fehlschlägt.
@Test public void whenMessageAssigned_thenItIsNotNull() { String message = null; assertNotNull(message); }
Wenn wir diesmal versuchen, den Befehl mvn package erneut auszuführen, schlägt der Build fehl und die Datei maven-0.0.1-SNAPSHOT.jar wird nicht erstellt.
Dies bedeutet, dass wir bei einem fehlgeschlagenen Test in unserer Anwendung keine ausführbare Datei bereitstellen können, es sei denn, wir beheben den Test.
Wie können wir dieses Problem lösen?
3. Maven Argumente
Maven hat seine eigenen Argumente, um dieses Problem zu lösen:
- -Dmaven.test.failure.ignore = true ignoriert alle Fehler, die während der Testausführung auftreten
- -Dmaven.test.skip = true würde die Tests nicht kompilieren
- -fn , -fae schlägt den Build unabhängig von den Testergebnissen nie fehl
Lassen Sie uns den Befehl mvn package -Dmaven.test.skip = true ausführen und die Ergebnisse sehen:
[INFO] Tests are skipped. [INFO] BUILD SUCCESS
Dies bedeutet, dass das Projekt erstellt wird, ohne die Tests zu kompilieren.
Führen Sie nun den Befehl mvn package -Dmaven.test.failure.ignore = true aus :
[INFO] Running testfail.TestFail [ERROR] whenMessageAssigned_thenItIsNotNull java.lang.AssertionError [INFO] BUILD SUCCESS
Unser Komponententest schlägt bei Bestätigung fehl, aber der Build ist erfolgreich.
Lassen Sie uns abschließend die Optionen -fn , -fae testen . Sowohl die Befehle package -fn als auch package -fae erstellen die JAR- Datei und erzeugen die Ausgabe BUILD SUCCESS, unabhängig davon, wann der Test MessageAssigned_thenItIsNotNull () fehlschlägt.
Im Falle des Multi-Modul-Projekts sollte die Option -fn verwendet werden. -fae fährt mit dem Modul fort, bei dem ein Test fehlgeschlagen ist, überspringt jedoch alle abhängigen Module.
4. Maven Surefire Plugin
Ein weiterer bequemer Weg, um unser Ziel zu erreichen, ist die Verwendung des Surefire-Plugins von Maven.
Eine erweiterte Übersicht über das Surefire-Plugin finden Sie in diesem Artikel.
Um Testfehler zu ignorieren, können wir einfach die testFailureIgnore- Eigenschaft auf true setzen :
maven-surefire-plugin ${maven.surefire.version} TestFail.java true
Lassen Sie uns nun die Ausgabe des Paketbefehls sehen :
[INFO] T E S T S [INFO] Running testfail.TestFail [ERROR] Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, <<< FAILURE! - in testfail.TestFail
An der Ausgabe der laufenden Tests können wir erkennen, dass die TestFail- Klasse fehlschlägt. Wenn wir jedoch weiter schauen, sehen wir, dass die BUILD SUCCESS-Nachricht ebenfalls vorhanden ist und die Datei maven-0.0.1-SNAPSHOT.jar kompiliert wird.
Je nach Bedarf können wir die Ausführung der Tests überhaupt überspringen. Dafür können wir die testFailureIgnore- Zeile ersetzen durch:
true
Oder setzen Sie das Kommandozeilenargument -DskipTests . Dadurch werden die Testklassen kompiliert, die Testausführung wird jedoch vollständig übersprungen.
5. Schlussfolgerung
In diesem Artikel haben wir gelernt, wie wir unser Projekt mit Maven unabhängig von den Testergebnissen erstellen . Wir haben die praktischen Beispiele für das Überspringen der fehlgeschlagenen Tests oder das vollständige Ausschließen der Zusammenstellung der Tests durchgearbeitet.
Wie üblich ist der vollständige Code für diesen Artikel im GitHub-Projekt verfügbar.