在 Junit 4 中运行所有测试

2022-09-01 08:52:56

我希望能够以编程方式运行项目中的所有测试。我知道Eclipse有一个“运行为JUnit测试”配置,它以某种方式获取项目中的所有测试并运行它们。有没有办法让我也以编程方式获取测试列表并运行它们?或者有没有一些好的方法可以构建一个包含所有测试用例的测试套件,而无需手动列出每个测试用例(所有700多个)?

我尝试过Eclipse中的“New... -> Test Suite”选项,但这似乎只适用于JUnit 3,通过从TestCase扩展来识别测试。

测试类是JUnit 4,所以它们唯一的区别特征是注释,没有命名约定,没有来自TestCase的子类化。

提前致谢!


答案 1

虽然它并没有真正解决您眼前的问题,但我发现创建套件和套件套件是一种非常有用的一般做法,例如,对于类似之类的软件包,并再次将这些套件组装在一个或多个套件中,例如并拥有一个顶级套件,例如。这样,就可以很容易地在一个步骤中同时运行所有测试,也可以为我当前正在处理的包运行子模块测试(并且让测试运行得比我总是运行所有测试更快):PackageFooSuiteModuleFooSuiteAllTestsSuite

@RunWith(Suite.class)
@Suite.SuiteClasses({ PackageFooSuite.class, PackageBarSuite.class} )
public final class AllTestsSuite {} // or ModuleFooSuite, and that in AllTests

答案 2

其他答案都没有为我做。我需要运行40k个测试,因此手动列出每个类不是一个选项。

我用ClasspathSuite做到了这一点。在类路径中运行所有 Junit4 和 Junit3 测试用例的测试套件如下所示:

import org.junit.extensions.cpsuite.ClasspathSuite;
import org.junit.extensions.cpsuite.ClasspathSuite.*;
import org.junit.runner.RunWith;
import org.junit.runner.JUnitCore;
import static org.junit.extensions.cpsuite.SuiteType.*;

@RunWith(ClasspathSuite.class)
@SuiteTypes({ JUNIT38_TEST_CLASSES, TEST_CLASSES })
public class RunAllSuite {
        /* main method not needed, but I use it to run the tests */
        public static void main(String args[]) {
                JUnitCore.runClasses(RunAllSuite.class);
        }
}

我需要从命令行运行它,所以这就是我所做的:

  1. cp-1.2.6.jar 下载
  2. 创建前面提到的 RunAllSuite
  3. 编译类,javac RunAllSuite.java -cp cpsuite-1.2.6.jar;junit-4.8.1.jar
  4. 在类路径中使用目标测试运行它,java -cp cpsuite-1.2.6.jar;junit-4.8.1.jar;path/to/runallsuite/folder;target/classes;target/test-classes RunAllSuite

就是这样。使用上面的RunAllSuite,在代码中的任何地方,您都可以执行JUnitCore.runClasses(RunAllSuite.class),它在类路径中运行所有测试。还有其他配置选项,这些选项在 ClasspathSuite 主页中进行了说明。

另请注意,上面给出的类不会打印任何内容。如果需要,您可以这样做

import org.junit.extensions.cpsuite.ClasspathSuite;
import org.junit.extensions.cpsuite.ClasspathSuite.*;
import org.junit.runner.RunWith;
import org.junit.runner.JUnitCore;
import org.junit.internal.TextListener;
import static org.junit.extensions.cpsuite.SuiteType.*;

@RunWith(ClasspathSuite.class)
@SuiteTypes({ JUNIT38_TEST_CLASSES, TEST_CLASSES })
public class RunAllSuite {
        public static void main(String args[]) {
                JUnitCore junit = new JUnitCore();
                junit.addListener(new TextListener(System.out));
                junit.run(RunAllSuite.class);
        }
}

推荐