Запуск одиночного теста из класса 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, но я бы предпочел не изменять источник моих тестовых классов вручную (пытаясь автоматизировать это). Я также видел, что у Maven может быть способ сделать это, но, если возможно, я бы хотел избежать зависимости от Maven.

Поэтому мне интересно, есть ли способ сделать это?


Ключевые моменты, которые я ищу:

  • Возможность запуска одного теста из тестового класса JUnit
  • Командная строка (с использованием JUnit)
  • Избегайте изменения источника теста
  • Избегайте использования дополнительных инструментов
Кевин Джалберт
источник
4
Круто, еще один энтузиаст типа "Unix - моя IDE". Мне нравится использовать среду IDE для редактора (особенно с подключаемым модулем vim для NetBeans), но я согласен с тем, что небольшие острые инструменты, которые работают «вечно» и могут быть собраны в произвольных конфигурациях, часто лучше, чем постоянное повторное изучение эзотерических функций продолжающегося серия марок и версий IDE. Повезло тебе!
Roboprog
2
Вы сказали, что хотите избежать maven. Для тех, кто хочет сделать это с помощью maven, см. Здесь maven.apache.org/plugins/maven-surefire-plugin/examples/…
reevesy

Ответы:

79

Вы можете довольно легко создать собственный, базовый JUnit runner. Вот тот, который будет запускать единственный тестовый метод в форме 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 для сборки своего проекта и плагин SureFire maven для запуска тестов junit. Если у вас есть такая настройка, вы можете:

mvn -Dtest=GreatTestClass#testMethod test

В этом примере мы просто запускаем тестовый метод с именем «testMethod» в классе «GreatTestClass».

Для получения дополнительной информации посетите http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html.

Yiling Lu
источник
-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
Это запускает каждый тест в классе, а не только один тест.
Robber