Запустіть один тест із класу JUnit за допомогою командного рядка


95

Я намагаюся знайти підхід, який дозволить мені запустити один тест із класу JUnit, використовуючи лише командний рядок та java.

Я можу запустити весь набір тестів з класу, використовуючи наступне:

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

Я дійсно хочу зробити щось подібне:

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

або:

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

Я помітив, що можуть бути способи зробити це за допомогою анотацій JUnit, але я волів би не змінювати джерело своїх тестових класів вручну (намагаючись це автоматизувати). Я також бачив, що у Мейвена може бути спосіб зробити це, але, якщо це можливо, я хотів би уникати залежності від Мейвена.

Тож мені цікаво, чи є якийсь спосіб це зробити?


Ключові моменти, які я шукаю:

  • Можливість запуску одного тесту з тестового класу JUnit
  • Командний рядок (за допомогою JUnit)
  • Уникайте модифікації тестового джерела
  • Уникайте використання додаткових інструментів

4
Класно, ще один ентузіаст типу "Unix - це моя IDE". Мені подобається використовувати IDE для редактора (особливо з плагіном vim для NetBeans), але я погоджуюсь з тим, що невеликі гострі інструменти, які тривають "вічно" і можуть бути зібрані у довільних конфігураціях, часто кращі, ніж постійне вивчення езотеричних особливостей постійного серія брендів та версій IDE. Добре тобі!
Roboprog

2
Ви сказали, що хочете уникати Maven. Для тих, хто хоче зробити це за допомогою maven, див. Тут, maven.apache.org/plugins/maven-surefire-plugin/examples/…
reevesy

Відповіді:


79

Ви можете досить просто зробити власний бігун JUnit. Ось такий, який буде запускати один метод тестування у формі 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);
    }
}

Ви можете викликати це так:

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

Після короткого перегляду джерела JUnit я дійшов того ж висновку, що і ви, що JUnit не підтримує це спочатку. Для мене це ніколи не було проблемою, оскільки всі IDE мають власні інтеграції JUnit, які дозволяють вам запустити метод тестування під курсором, серед інших дій. Я ніколи не запускав тести JUnit безпосередньо з командного рядка; Я завжди дозволяв IDE або інструменту побудови (Ant, Maven) подбати про це. Тим більше, що точка входу CLI за замовчуванням (JUnitCore) не видає жодних результатів, окрім ненульового коду виходу при невдалих тестах.

ПРИМІТКА: для версії JUnit> = 4.9 вам потрібна бібліотека Hamcrest у шляху до класу


2
Насправді, я, схоже, пам’ятаю, як отримав повну трасу стека в журналі, коли твердження в тесті не вдалося, а також (необов’язково, коли визначено) повідомлення від кожного твердження, що описує нереалізовані очікування. Дякую за обхід.
Roboprog

48

Я використовую Maven для побудови свого проекту, а для запуску тестів junit використовую плагін maven SureFire. За умови, що у вас є така настройка, ви можете зробити:

mvn -Dtest=GreatTestClass#testMethod test

У цьому прикладі ми просто запускаємо метод тестування з назвою "testMethod" у класі "GreatTestClass".

Щоб отримати докладнішу інформацію, перегляньте http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html


-2

Ми використовували IntelliJ і витратили досить багато часу, намагаючись це зрозуміти.

В основному, це передбачає 2 кроки:

Крок 1: Складіть тестовий клас

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

Крок 2: Запустіть тест

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


6
Це запускає кожен тест у класі, а не лише один тест.
Грабіжник
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.