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


95

我试图找到一种方法,使我可以仅使用命令行和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)
  • 避免修改测试源
  • 避免使用其他工具

4
很酷,另一个“ Unix是我的IDE”类型的狂热者。我喜欢使用IDE作为编辑器(尤其是NetBeans的vim插件),但是我同意持久使用“小巧”,可以以任意配置组装的小型锋利工具通常要比不断地学习持续性的深奥功能要好。系列IDE品牌和版本。对你有好处!
Roboprog

2
您说过要避开专家。对于任何人谁愿意做这个使用maven看到这里看看,maven.apache.org/plugins/maven-surefire-plugin/examples/...
reevesy

Answers:


79

您可以非常轻松地创建自定义的准系统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)不会在测试失败时产生非零退出代码以外的任何结果输出。

注意:对于> = 4.9的JUnit版本,您需要在类路径中包含hamcrest


2
实际上,我似乎记得当测试中的断言失败时在日志中获得完整的堆栈跟踪信息,以及每个断言中描述未实现期望的消息(定义时为可选)。感谢您的解决方法。
Roboprog 2012年


-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
这将运行该类中的每个测试,而不仅仅是一个测试。
强盗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.