Führen Sie einen einzelnen Test von einer JUnit-Klasse über die Befehlszeile aus

95

Ich versuche einen Ansatz zu finden, mit dem ich einen einzelnen Test aus einer JUnit-Klasse nur mit Befehlszeile und Java ausführen kann.

Ich kann den gesamten Satz von Tests aus der Klasse folgendermaßen ausführen:

java -cp .... org.junit.runner.JUnitCore org.package.classname

Was ich wirklich tun möchte, ist ungefähr so:

java -cp .... org.junit.runner.JUnitCore org.package.classname.method

oder:

java -cp .... org.junit.runner.JUnitCore org.package.classname#method

Ich habe festgestellt, dass es Möglichkeiten gibt, dies mithilfe von JUnit-Annotationen zu tun, aber ich würde es vorziehen, die Quelle meiner Testklassen nicht manuell zu ändern (um dies zu automatisieren). Ich habe auch gesehen, dass Maven eine Möglichkeit hat, dies zu tun, aber wenn möglich, würde ich es gerne vermeiden, von Maven abhängig zu sein.

Ich frage mich also, ob es eine Möglichkeit gibt, dies zu tun?


Wichtige Punkte, die ich suche:

  • Möglichkeit, einen einzelnen Test aus einer JUnit-Testklasse auszuführen
  • Befehlszeile (mit JUnit)
  • Vermeiden Sie es, die Testquelle zu ändern
  • Vermeiden Sie die Verwendung zusätzlicher Werkzeuge
Kevin Jalbert
quelle
4
Cool, ein weiterer Enthusiast vom Typ "Unix ist meine IDE". Ich mag es, eine IDE für einen Editor zu verwenden (insbesondere mit dem vim-Plugin für NetBeans), aber ich stimme zu, dass kleine scharfe Werkzeuge, die "für immer" halten und in beliebigen Konfigurationen zusammengestellt werden können, oft besser sind, als die esoterischen Funktionen eines Fortsetzers ständig neu zu lernen Serie von IDE-Marken und -Versionen. Schön für dich!
Roboprog
2
Sie sagten, Sie wollten Maven vermeiden. Für alle, die dies mit maven tun möchten, siehe hier, maven.apache.org/plugins/maven-surefire-plugin/examples/…
reevesy

Antworten:

79

Sie können ziemlich einfach einen benutzerdefinierten Barebone-JUnit-Läufer erstellen. Hier ist eine, die eine einzelne Testmethode in der folgenden Form ausführt com.package.TestClass#methodName:

import org.junit.runner.JUnitCore;
import org.junit.runner.Request;
import org.junit.runner.Result;

public class SingleJUnitTestRunner {
    public static void main(String... args) throws ClassNotFoundException {
        String[] classAndMethod = args[0].split("#");
        Request request = Request.method(Class.forName(classAndMethod[0]),
                classAndMethod[1]);

        Result result = new JUnitCore().run(request);
        System.exit(result.wasSuccessful() ? 0 : 1);
    }
}

Sie können es folgendermaßen aufrufen:

> java -cp path/to/testclasses:path/to/junit-4.8.2.jar SingleJUnitTestRunner 
    com.mycompany.product.MyTest#testB

Nach einem kurzen Blick in die JUnit-Quelle bin ich zu dem gleichen Schluss gekommen wie Sie, dass JUnit dies nicht nativ unterstützt. Dies war für mich nie ein Problem, da alle IDEs über benutzerdefinierte JUnit-Integrationen verfügen, mit denen Sie unter anderem die Testmethode unter dem Cursor ausführen können. Ich habe JUnit-Tests noch nie direkt über die Befehlszeile ausgeführt. Ich habe immer entweder die IDE oder das Build-Tool (Ant, Maven) dafür sorgen lassen. Zumal der Standard-CLI-Einstiegspunkt (JUnitCore) bei Testfehlern keine andere Ergebnisausgabe als einen Exit-Code ungleich Null erzeugt.

HINWEIS: Für die JUnit-Version> = 4.9 benötigen Sie die Hamcrest- Bibliothek im Klassenpfad

Mark Peters
quelle
2
Eigentlich erinnere ich mich, dass ich eine vollständige Stapelverfolgung im Protokoll erhalten habe, wenn eine Zusicherung in einem Test fehlgeschlagen ist, sowie die (optionale, wenn definiert) Nachricht von jeder Zusicherung, die die nicht realisierte Erwartung beschreibt. Danke für die Umgehung.
Roboprog
48

Ich verwende Maven, um mein Projekt zu erstellen, und das SureFire-Maven-Plugin, um Junit-Tests auszuführen. Vorausgesetzt, Sie haben dieses Setup, können Sie Folgendes tun:

mvn -Dtest=GreatTestClass#testMethod test

In diesem Beispiel führen wir nur eine Testmethode mit dem Namen "testMethod" in der Klasse "GreatTestClass" aus.

Weitere Informationen finden Sie unter http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html

Yiling Lu
quelle
-2

Wir haben IntelliJ verwendet und viel Zeit damit verbracht, es auch herauszufinden.

Grundsätzlich umfasst es 2 Schritte:

Schritt 1: Kompilieren Sie die Testklasse

% javac -cp .:"/Applications/IntelliJ IDEA 13 CE.app/Contents/lib/*" SetTest.java

Schritt 2: Führen Sie den Test aus

% java -cp .:"/Applications/IntelliJ IDEA 13 CE.app/Contents/lib/*" org.junit.runner.JUnitCore SetTest

Benjamin Tan Wei Hao
quelle
6
Dies führt jeden Test in der Klasse aus, nicht nur einen Test.
Räuber