Можете ли вы запустить все тесты JUnit в пакете из командной строки без явного их перечисления?

Если тестовые классы и JUnit находятся на пути к классам, можно запустить тесты JUnit из командной строки следующим образом:

java org.junit.runner.JUnitCore TestClass1 TestClass2

Теперь, есть ли способ запускать все тесты в пакете (и подпакетах)?

Я ищу что-то вроде

java org.junit.runner.JUnitCore com.example.tests.testsIWantToRun.*

Есть ли простой способ сделать это (который не включает maven или ant)?

Ответ 1

Junit позволяет вам определять наборы тестов. Каждый набор определяет коллекцию тестов, и запуск пакета приводит к запуску всех тестов. То, что я делаю, - это определить набор для каждого пакета, указав классы тестов для этого пакета вместе с наборами для любых подпакетов:

package com.foo.bar;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

import com.foo.bar.baz.Suite_baz;

@RunWith(Suite.class)
@Suite.SuiteClasses({
    ThisTest.class,
    ThatTest.class,
    TheOtherTest.class,
    Suite_baz.class,
})
public class Suite_bar {
}

Это не совсем легко. Вы должны создать пакеты и вручную обновить их новыми классами тестов. Полагаю, не составит труда написать небольшую программу java для ее создания автоматически, если кто-то захочет.

Ответ 2

Я задал этот вопрос, чтобы он мог выборочно удалять наборы тестов Cucumber проекта Jenkins, не зная, на что будут называться их классы RunTests, какие их CucumberOptions будут содержать или где они будут расположены. Тем временем я нашел несколько полезных потоков в StackOverflow, которые отвечают на мой вопрос:

Используя их, я могу разбить мои тесты на огурцы отдельно:

Во-первых, я использовал плагин сборки maven, чтобы получить тесты, упакованные в банку: fooobar.com/questions/572/...

Затем я скопировал зависимости тестов к целевой папке на Jenkins, как показано здесь: fooobar.com/questions/572/...

У нас уже есть флаг, который пропускает выполнение наших тестов, когда он установлен, поэтому я упаковываю свои тесты, не запуская их: mvn clean install -DskipMyTestModule=true

И используя код сверху и вызов снизу, я смогу сделать все это...

java -Dcucumber.options="src/test/resources/features --tags @b --format pretty:STDOUT --format html:target/cucumber-b --format json:target/cucumber-b.json" -Dname=value -cp target/artifact-1.2.8-SNAPSHOT-tests.jar;target/test-classes/libs/junit-4.11.jar;target/test-classes/libs/* org.junit.runner.JUnitCore com.example.foo.bar.test.cucumber.RunTest

Надеюсь, это поможет кому-то в будущем.:)

Ответ 3

С JUnit 4 это поддерживается с помощью расширения cpsuite. Все, что вам нужно сделать, это добавить его в свой тестовый путь (maven io.takari.junit:takari-cpsuite), создать класс динамического набора тестов:

package com.mycompany;
import org.junit.extensions.cpsuite.ClasspathSuite;
import org.junit.runner.RunWith;

@RunWith(ClasspathSuite.class)
@ClasspathSuite.IncludeJars(true)
public class RunAllTests {}

и запустите его:

java -cp ${CP} org.junit.runner.JUnitCore com.mycompany.RunAllTests

Ваш classpath ${CP} должен включать вашу тестовую банку, junit, hamcrest и cpsuite.