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

Java 使用命令行从JUnit类运行单个测试,java,unit-testing,command-line,junit,Java,Unit Testing,Command Line,Junit,我试图找到一种方法,使我能够仅使用命令行和java从JUnit类运行单个测试 我可以使用以下方法从类中运行整个测试集: java -cp .... org.junit.runner.JUnitCore org.package.classname 我真正想做的是这样的事情: java -cp .... org.junit.runner.JUnitCore org.package.classname.method > java -cp path/to/testclasses:path/to

我试图找到一种方法,使我能够仅使用命令行和java从JUnit类运行单个测试

我可以使用以下方法从类中运行整个测试集:

java -cp .... org.junit.runner.JUnitCore org.package.classname
我真正想做的是这样的事情:

java -cp .... org.junit.runner.JUnitCore org.package.classname.method
> java -cp path/to/testclasses:path/to/junit-4.8.2.jar SingleJUnitTestRunner 
    com.mycompany.product.MyTest#testB
或:

我注意到可能有一些方法可以使用JUnit注释来实现这一点,但我不希望手动修改测试类的源代码(尝试自动执行)。我也看到Maven可能有办法做到这一点,但如果可能的话,我希望避免依赖Maven

所以我想知道是否有任何方法可以做到这一点


我正在寻找的关键点:

  • 能够从JUnit测试类运行单个测试
  • 命令行(使用JUnit)
  • 避免修改测试源
  • 避免使用其他工具

您可以非常轻松地定制一款赤骨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 .... org.junit.runner.JUnitCore org.package.classname.method
> 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,您需要类路径中的库,我使用Maven来构建我的项目,并使用SureFire Maven插件来运行JUnit测试。 如果您有此设置,则可以执行以下操作:

mvn -Dtest=GreatTestClass#testMethod test
在本例中,我们只是在类“greclass”中运行一个名为“testMethod”的测试方法


要了解更多详细信息,请查看我们使用了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

以下命令工作正常

mvn -Dtest=SqsConsumerTest -DfailIfNoTests=false test

实际上,我似乎记得当测试中的断言失败时,日志中会出现一个完整的堆栈跟踪,以及每个断言中描述未实现预期的(可选,定义时)消息。感谢您的帮助。酷,另一个“Unix是我的IDE”类型的爱好者。我喜欢使用IDE作为编辑器(特别是针对NetBeans的vim插件),但我同意,使用“永远”的、可以以任意配置组装的小型锐利工具通常比不断地重新学习一系列IDE品牌和版本的深奥功能要好。真为你高兴!你说你想避开maven。对于任何想使用maven执行此操作的人,请看这里,它运行类中的每个测试,而不仅仅是一个测试。