So führen Sie JUnit-Testfälle über die Befehlszeile aus

333

Ich möchte JUnit-Testfälle über die Befehlszeile ausführen. Wie kann ich das machen?

KK.
quelle
ähnliche Android Junit Frage: stackoverflow.com/q/11144466/611007
n611x007
android docs: Ausführen von Tests auf einem Gerät oder Emulator (über die Befehlszeile). ( via andreea.sandu)
n611x007
Antwort für JUnit 5 unter stackoverflow.com/a/52373592/1431016
Sormuras
javac -cp "junit-4.12.jar; hamcrest-core-1.3.jar;." Tests.javaarbeitete für mich. Beachten Sie den Endpunkt - es ist wichtig!
Parsecer

Antworten:

274

Für JUnit 5.x ist es:

java -jar junit-platform-console-standalone-<version>.jar <Options>

Eine kurze Zusammenfassung finden Sie unter https://stackoverflow.com/a/52373592/1431016 und ausführliche Informationen unter https://junit.org/junit5/docs/current/user-guide/#running-tests-console-launcher

Für JUnit 4.X ist es wirklich:

java -cp .:/usr/share/java/junit.jar org.junit.runner.JUnitCore [test class name]

Wenn Sie jedoch JUnit 3.X verwenden, beachten Sie, dass der Klassenname anders ist:

java -cp .:/usr/share/java/junit.jar junit.textui.TestRunner [test class name]

Möglicherweise müssen Sie dem Klassenpfad weitere JARs oder Verzeichnisse mit Ihren Klassendateien hinzufügen und diese durch Semikolons (Windows) oder Doppelpunkte (UNIX / Linux) trennen. Das hängt von Ihrer Umgebung ab.

Bearbeiten: Ich habe als Beispiel das aktuelle Verzeichnis hinzugefügt. Hängt von Ihrer Umgebung ab und davon, wie Sie Ihre Anwendung erstellen (kann bin / oder build / oder sogar my_application.jar usw. sein). Hinweis Java 6+ unterstützt Globs im Klassenpfad. Sie können Folgendes tun:

java -cp lib/*.jar:/usr/share/java/junit.jar ...

Ich hoffe es hilft. Schreibe Tests! :-)

lzap
quelle
@Izap Haben Sie eine Idee, programmgesteuert festzustellen, ob ein Test JUnit4 oder JUnit3 verwendet?
Goaler444
2
Class.forName denke ich. Es ist Jahre her, dass ich zum letzten Mal in Java programmiert habe ...
lzap
und was ist, wenn Sie Android verwenden?
n611x007
1
Die Dokumentation für das Argument "-cp" (dh CLASSPATH) finden Sie hier (Java 7, Unix) und hier (Tutorial) und hier (Java 8, Unix) und hier (Java 8, Windows) . Anscheinend werden jetzt Platzhalter im Klassenpfad unterstützt.
David Tonhofer
1
Downvote. Für JUnit 4.x ist es nicht richtig. Ihre Anweisungen lauten "Klasse konnte nicht gefunden werden: [Name der Testklasse]", auch wenn sich [Name der Testklasse] im Klassenpfad befindet.
Philip Rego
117

Maven Weg

Wenn Sie Maven verwenden, können Sie den folgenden Befehl ausführen, um alle Ihre Testfälle auszuführen:

mvn clean test

Oder Sie können einen bestimmten Test wie unten ausführen

mvn clean test -Dtest=your.package.TestClassName
mvn clean test -Dtest=your.package.TestClassName#particularMethod

Wenn Sie den Stack-Trace (falls vorhanden) in der Konsole anstelle von Berichtsdateien im Ordner target \ surefire-reports anzeigen möchten, setzen Sie die Benutzereigenschaft surefire.useFile auf false. Zum Beispiel:

mvn clean test -Dtest=your.package.TestClassName -Dsurefire.useFile=false

Gradle Weg

Wenn Sie Gradle verwenden, können Sie den folgenden Befehl ausführen, um alle Ihre Testfälle auszuführen:

gradle test

Oder Sie können einen bestimmten Test wie unten ausführen

gradle test --tests your.package.TestClassName
gradle test --tests your.package.TestClassName.particularMethod

Wenn Sie weitere Informationen wünschen, können Sie Optionen wie --stacktrace, --info oder --debug in Betracht ziehen.

Wenn Sie beispielsweise Gradle mit der Info-Protokollierungsstufe --info ausführen, wird das Ergebnis jedes Tests angezeigt, während dieser ausgeführt wird. Wenn es eine Ausnahme gibt, wird Ihnen die Stapelverfolgung angezeigt, die auf das Problem hinweist.

gradle test --info

Wenn Sie die allgemeinen Testergebnisse anzeigen möchten, können Sie den Bericht beispielsweise im Browser öffnen (Öffnen Sie ihn mit Google Chrome in Ubuntu):

google-chrome build/reports/tests/index.html

Ameisenweg

Sobald Sie Ihre Ant-Build-Datei build.xml eingerichtet haben, können Sie Ihre JUnit-Testfälle über die folgende Befehlszeile ausführen:

ant -f build.xml <Your JUnit test target name>

Sie können dem folgenden Link folgen, um weitere Informationen zum Konfigurieren von JUnit-Tests in der Ant-Build-Datei zu erhalten: https://ant.apache.org/manual/Tasks/junit.html

Normaler Weg

Wenn Sie Maven, Gradle oder Ant nicht verwenden, können Sie folgendermaßen vorgehen:

Zunächst müssen Sie Ihre Testfälle kompilieren. Zum Beispiel (unter Linux):

javac -d /absolute/path/for/compiled/classes -cp /absolute/path/to/junit-4.12.jar /absolute/path/to/TestClassName.java

Führen Sie dann Ihre Testfälle aus. Zum Beispiel:

java -cp /absolute/path/for/compiled/classes:/absolute/path/to/junit-4.12.jar:/absolute/path/to/hamcrest-core-1.3.jar org.junit.runner.JUnitCore your.package.TestClassName
Yuci
quelle
1
Ich mag, dass diese Antwort Beispiele für mehrere Technologien enthält, ein dickes Lob!
Josie Thompson
Was ist mit groovigen Tests mit dem letzten Ansatz?
Midori
1
Gut verdientes goldenes Abzeichen;)
Eric Duminil
Danke für die Version für gradle! Ein großes Lob!
Ady
52

Die Antwort, die @lzap gab, ist eine gute Lösung. Ich möchte jedoch hinzufügen, dass Sie hinzufügen sollten. zum Klassenpfad, damit Ihr aktuelles Verzeichnis nicht ausgelassen wird, was dazu führt, dass Ihre eigenen Klassen weggelassen werden. Das ist mir auf einigen Plattformen passiert. Eine aktualisierte Version für JUnit 4.x wäre also:

java -cp .:/usr/share/java/junit.jar org.junit.runner.JUnitCore [test class name]
rand_acs
quelle
1
soll das ein Semikolon sein?
Panny
14
@panny es ist ein Semikolon unter Windows. In einer n * nix-Umgebung (mindestens OSX und alle von mir verwendeten Linux-Distributionen) verwenden Sie einen Doppelpunkt.
Rand_acs
1
@rand_acs Muss der Name der Testklasse der vollständig klassifizierte Klassenname sein?
Goaler444
1
@ Goaler444 Ja, ich verwende immer den vollständigen Namen mit allen angegebenen Namespaces.
Rand_acs
22

Stellen Sie sicher, dass sich JUnit.jar in Ihrem Klassenpfad befindet, und rufen Sie dann den Befehlszeilenläufer über die Konsole auf

java org.junit.runner.JUnitCore [Name der Testklasse]

Referenz: junit FAQ

Gishu
quelle
4
Sie müssen auch den Rest des Klassenpfads Ihres Projekts einrichten.
Thilo
Dies gibt nur "Klasse konnte nicht gefunden werden: [Name der Testklasse]", selbst wenn sich [Name der Testklasse] im Klassenpfad befindet.
Philip Rego
19

Mit JUnit 4.12 hat Folgendes bei mir nicht funktioniert:

java -cp .:/usr/share/java/junit.jar org.junit.runner.JUnitCore [test class name]

Anscheinend sollten Sie ab JUnit 4.11 auch Folgendes hamcrest-core.jarin Ihren Klassenpfad aufnehmen:

java -cp .:/usr/share/java/junit.jar:/usr/share/java/hamcrest-core.jar org.junit.runner.JUnitCore [test class name]
Stefan van den Akker
quelle
Hatte das gleiche Problem mit JUnit 4.12. Ich habe eine ähnliche Lösung gefunden, aber sie hat bei mir nicht funktioniert und JUnitCore konnte nicht geladen werden. Ich habe grundsätzlich zu JUnit 4.8.2 gewechselt, da hamcrest-core.jar nicht in den Klassenpfad aufgenommen werden muss.
Vladimir Nazarenko
Bestätigt, dass dies mit JUnit 4.12 erfolgen muss. +1.
Rayryeng
Dies funktionierte für mich:java -cp .:/usr/share/java/junit4.jar org.junit.runner.JUnitCore [test class name]
Raffi Khatchadourian
11

In Windows ist es

java -cp .;/path/junit.jar org.junit.runner.JUnitCore TestClass [Name der Testklasse ohne Erweiterung .class]

Zum Beispiel: c:\>java -cp .;f:/libraries/junit-4.8.2 org.junit.runner.JUnitCore TestSample1 TestSample2 ...und so weiter, wenn man mehr als eine Testklasse hat.

-cp steht für Klassenpfad und der Punkt (.) stellt den vorhandenen Klassenpfad dar, während Semikolon (;) das zusätzlich angegebene JAR an den Klassenpfad anfügt, wie im obigen Beispiel junit-4.8.2 jetzt im Klassenpfad verfügbar ist, um die JUnitCore-Klasse auszuführen, die Hier haben wir unsere Testklassen ausgeführt.

Die obige Befehlszeilenanweisung hilft Ihnen beim Ausführen von Junit-Tests (Version 4+) an der Eingabeaufforderung (z. B. MSDos).

Hinweis: JUnitCore ist eine Fassade zum Ausführen von Junit-Tests. Diese Fassade ist in mehr als 4 Junit-Versionen enthalten.

Schurkenjunge
quelle
Bitte erläutern Sie Ihre Antwort sehr kurz.
Mohit Jain
Ich habe Sie nicht gebeten, Ihre Antwort kurz zu halten. Ich bat um eine Erklärung (zumindest eine kurze Erklärung). Es ist eine gute Praxis, zu erklären, wie Ihre Antwort funktioniert. Die Leser mögen es verstehen, mögen es, stimmen es ab.
Mohit Jain
Wenn ich also ein zusätzliches Testglas UND das Vanille-Junit-Glas hätte, müsste ich beide im Java-Befehl cc haben, damit irgendetwas tatsächlich funktioniert? Gibt es eine Möglichkeit, all dies in eine Befehlszeile zu schreiben, damit ich nicht so viel eingeben muss?
Ungeheuer
5

Tatsächlich können Sie den Junit-Test auch zu einem ausführbaren Glas machen und das ausführbare Glas als Java-Jar bezeichnen

Indraneel
quelle
2
Klicken Sie in Eclipse mit der rechten Maustaste auf Ihr JUnit-Projekt -> Klicken Sie auf Exportieren -> Wählen Sie Java-> Runnable Jar File
Indraneel
4

Wenn Ihr Projekt auf Maven basiert, können Sie alle Testmethoden aus der Testklasse CustomTest, die zum Modul 'my-module' gehört, mit dem nächsten Befehl ausführen:

mvn clean test -pl :my-module -Dtest=CustomTest

Oder führen Sie nur 1 Testmethode myMethod aus der Testklasse CustomTest mit dem nächsten Befehl aus:

mvn clean test -pl :my-module -Dtest=CustomTest#myMethod

Für diese Fähigkeit benötigen Sie das Maven Surefire Plugin v.2.7.3 + und Junit 4. Weitere Details finden Sie hier: http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html


quelle
4

Persönlich würde ich den Maven todsicheren JUnit-Läufer verwenden, um das zu tun.

Djangofan
quelle
-1

Wenn Ihr Projekt auf Ameisen basiert, sollten Sie in der Lage sein, Folgendes über die Konsole zu tun:

ant test

Wenn dies nicht funktioniert, Ihr Projekt jedoch auf Ameisen basiert, können Sie ant -pdie Hauptziele des Projekts auflisten.

Cherouvim
quelle
2
Das Q hat nichts mit Ant
Accuya
3
Deshalb habe ich gesagt, "wenn Ihr Projekt auf Ameisen basiert". Beachten Sie auch, dass das OP möglicherweise nichts über Ameisen weiß.
Cherouvim
Ich hatte dieses Dillema, Unit-Test-Dateien befanden sich nicht in einem Ordner, der von Eclipse als Quelle markiert wurde. Dieses Projekt verwendet ant zum Erstellen. Dies war der richtige Weg, um diese JUnit-Tests auszuführen.
Andrzej Rehmann