使用命令行从 JUnit 类运行单个测试

Posted

技术标签:

【中文标题】使用命令行从 JUnit 类运行单个测试【英文标题】:Run single test from a JUnit class using command-line 【发布时间】:2012-03-06 11:35:54 【问题描述】:

我正在尝试找到一种方法,允许我仅使用命令行和 java 从 JUnit 类运行单个测试。

我可以使用以下方法从班级运行整套测试:

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) 避免修改测试源 避免使用其他工具

【问题讨论】:

酷,另一个“Unix 是我的 IDE”类型的爱好者。我喜欢将 IDE 用于编辑器(尤其是使用用于 NetBeans 的 vim 插件),但我同意“永远”持续使用并且可以以任意配置组装的小型尖锐工具通常比不断重新学习持续的深奥特征要好系列IDE品牌和版本。对你有好处! 你说你想避免使用 maven。对于任何想要使用 maven 执行此操作的人,请参阅此处,maven.apache.org/plugins/maven-surefire-plugin/examples/… 【参考方案1】:

以下命令可以正常工作。

mvn -Dtest=SqsConsumerTest -DfailIfNoTests=false test

【讨论】:

【参考方案2】:

您可以相当轻松地制作自定义的准系统 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 库

【讨论】:

实际上,我似乎记得当测试中的断言失败时,我在日志中获得了完整的堆栈跟踪,以及来自每个断言的描述未实现期望的(可选,当定义时)消息。感谢您的解决方法。【参考方案3】:

我们使用了 IntelliJ,并且也花了很多时间试图弄清楚。

基本上,它包括两个步骤:

第 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

【讨论】:

这会运行班级中的所有测试,而不仅仅是一个测试。【参考方案4】:

我使用 Maven 构建我的项目,并使用 SureFire maven 插件运行 junit 测试。 如果你有这个设置,那么你可以这样做:

mvn -Dtest=GreatTestClass#testMethod test

在这个例子中,我们只是在“GreatTestClass”类中运行一个名为“testMethod”的测试方法。

更多详情,请查看http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html

【讨论】:

以上是关于使用命令行从 JUnit 类运行单个测试的主要内容,如果未能解决你的问题,请参考以下文章

从命令行从 iOS 中的测试套件运行单个/可选测试用例(XCTestCase)

Maven 和 JUnit 5:在一个类中运行单个测试

Serenity Junit - 如何通过 mvn 命令使用 serenity 执行指定的单个测试 [重复]

如何使用命令行从私有 github 存储库下载单个原始文件?

如何从命令行运行 JUnit 测试用例

如何使用 python 命令行从文件中运行 python 函数?