Uruchom pojedynczy test z klasy JUnit za pomocą wiersza polecenia


95

Próbuję znaleźć podejście, które pozwoli mi uruchomić pojedynczy test z klasy JUnit przy użyciu tylko wiersza poleceń i języka Java.

Mogę przeprowadzić cały zestaw testów z klasy używając:

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

To, co naprawdę chcę zrobić, to coś takiego:

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

lub:

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

Zauważyłem, że mogą istnieć sposoby, aby to zrobić za pomocą adnotacji JUnit, ale wolałbym nie modyfikować źródła moich klas testowych ręcznie (próbując to zautomatyzować). Widziałem też, że Maven może mieć na to sposób, ale jeśli to możliwe, chciałbym uniknąć polegania na Mavenie.

Zastanawiam się więc, czy jest jakiś sposób, aby to zrobić?


Kluczowe punkty, których szukam:

  • Możliwość uruchomienia pojedynczego testu z klasy testowej JUnit
  • Wiersz poleceń (za pomocą JUnit)
  • Unikaj modyfikowania źródła testu
  • Unikaj używania dodatkowych narzędzi

4
Fajnie, kolejny entuzjasta typu „Unix jest moim IDE”. Lubię używać IDE dla edytora (szczególnie z wtyczką vim do NetBeans), ale zgadzam się, że małe, ostre narzędzia, które działają "wiecznie" i mogą być montowane w dowolnych konfiguracjach, są często lepsze niż ciągłe ponowne uczenie się ezoterycznych funkcji ciągłego seria marek i wersji IDE. Dobrze dla ciebie!
Roboprog

2
Mówiłeś, że chcesz uniknąć maven. Dla każdego, kto chce to zrobić za pomocą maven, zobacz tutaj, maven.apache.org/plugins/maven-surefire-plugin/examples/ ...
reevesy

Odpowiedzi:


79

Możesz dość łatwo stworzyć niestandardowy, szkieletowy biegacz JUnit. Oto taki, który uruchomi pojedynczą metodę testową w postaci 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);
    }
}

Możesz to wywołać w ten sposób:

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

Po szybkim przejrzeniu źródła JUnit doszedłem do tego samego wniosku, co Ty, że JUnit nie obsługuje tego natywnie. Nigdy nie stanowiło to dla mnie problemu, ponieważ wszystkie środowiska IDE mają niestandardowe integracje JUnit, które umożliwiają między innymi uruchamianie metody testowej pod kursorem. Nigdy nie uruchamiałem testów JUnit bezpośrednio z wiersza poleceń; Zawsze pozwalałem, by zajęło się tym IDE lub narzędzie do budowania (Ant, Maven). Zwłaszcza, że ​​domyślny punkt wejścia CLI (JUnitCore) nie generuje żadnych wyników innych niż niezerowy kod zakończenia w przypadku niepowodzenia testu.

UWAGA: dla wersji JUnit> = 4.9 potrzebujesz biblioteki hamcrest w ścieżce klas


2
W rzeczywistości wydaje mi się, że pamiętam pełny ślad stosu w dzienniku, gdy asercja w teście nie powiodła się, a także (opcjonalny, jeśli zdefiniowano) komunikat z każdego potwierdzenia opisującego niezrealizowane oczekiwanie. Dzięki za obejście problemu.
Roboprog


-2

Użyliśmy IntelliJ i spędziliśmy sporo czasu, próbując też to rozgryźć.

Zasadniczo obejmuje 2 kroki:

Krok 1: Skompiluj klasę testową

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

Krok 2: Uruchom test

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


6
To uruchamia każdy test w klasie, a nie tylko jeden test.
Robber
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.