您是否可以从命令行在包中运行所有JUnit测试而无需明确列出它们?

时间:2014-07-01 12:49:47

标签: java unit-testing command-line junit

如果测试类和JUnit都在类路径上,可以从命令行运行JUnit测试,如下所示:

java org.junit.runner.JUnitCore TestClass1 TestClass2

现在,有没有办法在包(和子包)中运行所有测试?

我正在寻找像

这样的东西
java org.junit.runner.JUnitCore com.example.tests.testsIWantToRun.*

有没有一种简单的方法(不涉及maven或蚂蚁)?

3 个答案:

答案 0 :(得分:8)

Junit允许您定义suites个测试。每个套件都定义了一组测试,运行该套件会导致所有测试运行。我所做的是为每个包定义一个套件,列出该包的测试类以及任何子包的套件:

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 {
}

这不是完全没有用的。您必须构建套件并使用新的测试类手动更新它们。我想如果有人愿意的话,编写一个小程序来自动生成这些程序并不困难。

答案 1 :(得分:3)

我问这个问题是能够有选择性地对Jenkins的项目进行Cucumber测试,而不知道他们的RunTests类会被调用什么,他们的CucumberOptions将包含什么,或者它们将位于何处。我在此期间在StackOverflow上找到了一些有用的线程,它回答了我的问题:

使用这些,我可以按照以下方式单独进行黄瓜测试:

首先,我使用maven程序集插件将测试打包在jar中: https://stackoverflow.com/a/574650/2018047

然后我将测试的依赖项复制到Jenkins上的目标文件夹,如下所示: https://stackoverflow.com/a/23986765/2018047

我们已经有一个标志,它会在设置时跳过测试的执行,所以我打包我的测试而不运行它们: 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

希望这可以帮助将来的某个人。 :)

答案 2 :(得分:2)

使用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

您的类路径${CP}应该包含您的测试jar,junit,hamcrest和cpsuite。