在 Junit 4 中运行所有测试

Posted

技术标签:

【中文标题】在 Junit 4 中运行所有测试【英文标题】:Run all tests in Junit 4 【发布时间】:2010-02-12 20:53:02 【问题描述】:

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

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

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

提前致谢!

【问题讨论】:

看看这是否有帮助:burtbeckwith.com/blog/?p=52 【参考方案1】:

虽然它并不能真正解决您当前的问题,但我发现创建套件和套件套件是一种非常有用的一般做法,例如对于类似PackageFooSuite 等的包,然后将这些套件再次组装到一个或多个套件中,例如ModuleFooSuite,并拥有一个***套件,例如AllTestsSuite。这样一来,就可以轻松地在一个步骤中运行所有测试以及我当前正在处理的包的子模块测试(并且让测试运行得比我总是运行所有测试更快):

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

【讨论】:

我倾向于同意你的观点。不幸的是,在我之前从事此工作的人并没有留下大约 700 个或更多的测试用例,我不喜欢手动手动串起来 @alexloh:是的,完全可以理解。也许在没有太多麻烦的情况下自动执行此操作实际上是可行的,例如:为每个包/目录创建一个由当前包/目录中所有文件的名称组成的套件类。如果从最底层的目录开始,将生成的套件包含在上一级的子包中也可能相对简单。【参考方案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);
        

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

    Downloaded cp-1.2.6.jar 创建前面提到的 RunAllSuite 编译类,javac RunAllSuite.java -cp cpsuite-1.2.6.jar;junit-4.8.1.jar 在类路径中使用目标测试运行它,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);
        

【讨论】:

“我需要运行 40k 个测试,因此手动列出每个类不是一个选项。”您是否可以使用某种文本处理程序来扫描这些测试类文件的名称并创建代码来运行测试?也就是说,对于每个 .java 文件,在 RunAllSuite 类中打印一行写着 JUnitCore.main( $thatfilename.class ); 的行——并不是说您的代码还不能工作。 @Jan 即使我们抛开不切实际,类的大小也有其限制(准确地说是 64k 个字符)。我不知道所有这些测试名称如何适合。 啊,好点子。我不知道有一个硬限制!此外,您的解决方案已经非常优雅了!【参考方案3】:

您可以在 maven 中使用 surefire plugin 轻松完成此操作:我通常在比较它们以供 Eclipse 使用 (mvn eclipse:clean eclipse:eclipse) 之前从命令行清理/编译/安装我的项目,您可以在你的 pom 列出了你每次运行 mvn install 时要运行的所有测试。确切地说,您不是以编程方式调用它们,但您当然可以整体调用它们。

【讨论】:

嗯...我不使用 Maven,但如果它解决了我的问题,我会尝试一下。如果我发现它有效,我会勾选它。谢谢!!【参考方案4】:

在 Eclipse 中(我使用的是 4.6.1) - 右键单击​​项目文件夹,选择“Run As”,选择“JUnit Test”

它将运行该项目中的所有测试。包也一样。

【讨论】:

感谢您的简单回答。非常感谢。 src/test/java下有多个包时不起作用【参考方案5】:

使用 Spring 我的头顶:

实现一个 TypeFilter 来匹配带有 @Test 注释的方法的类(不要忘记考虑超类) 在最顶层的测试包上调用类路径扫描 使用扫描结果调用 JUnitRunner

更多关于类路径扫描和自定义类型过滤器的信息here

【讨论】:

【参考方案6】:

使用运行配置对话框中的 Eclipse Indigo(可能还有 Helios),您现在可以在选定的项目、包或源文件夹中运行所有测试。

文章 Java Unit testing with JUnit 4.x in Eclipse 也是 Eclipse 的一个很好的参考。

【讨论】:

【参考方案7】:

我还建议使用 JUnit Suite 注释。关注link for more detail。

【讨论】:

这听起来像是 OP 明确想要避免的手动列表。

以上是关于在 Junit 4 中运行所有测试的主要内容,如果未能解决你的问题,请参考以下文章

未找到测试运行程序“JUnit 4”的测试

如何在Junit测试中运行Jmeter线程组

在 Maven 构建中并行运行 junit 测试?

在 JUnit 5 中,如何在所有测试之前运行代码

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

如何在测试失败后但在任何 @After 方法之前让 JUnit 4.8 运行代码?