是否可以从命令行运行包中的所有 JUnit 测试,而不显式列出它们?

2022-09-03 07:20:04

如果测试类和 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

我问这个问题是为了能够有选择地在 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

希望这能帮助将来的人。:)


推荐