首页 > 解决方案 > 为什么 JUnit 5 Suite 注释 @SelectClasses 和 @IncludeClassNamePatterns 无法找到不以“Tests”或“Test”结尾的测试?

问题描述

在升级到 JUnit 5(版本 5.5.2)时,我对套件功能有了一个奇怪的发现:我的套件可以找到并运行以单词“Test”结尾的测试,但找不到不以“”结尾的测试测试”(在我的例子中,它们以“Base”结尾)。

在 JUnit 4 中,我们使用@Suite.SuiteClasses()注解来查找这些测试,但 JUnit 5 的@SelectClasses注解似乎完全错过了这些测试类。即使使用也@IncludeClassNamePatterns({"^Com.*Base.*?$"})无法检测到我觉得奇怪的测试(我想运行的测试以“Com”开头)。在此之后,我尝试了@Tag()注释,它也不起作用。

我认为这是因为 Maven Surefire(2.22.2 版)仅检测以 Test 开头或以 Test、Tests 或 TestCase 结尾的测试类。所以,我试图包括我的基本测试用例:

<includes>
        <include>**/*Base.java</include>
        <include>**/Test*.java</include>
        <include>**/*Test.java</include>
        <include>**/*Tests.java</include>
        <include>**/*TestCase.java</include>
</includes>

当我构建这个项目时,Maven 能够运行这些 Base 测试,但测试套件仍然无法找到它们。

我的代码将类似于以下内容:

@RunWith(JUnitPlatform.class)
@SelectClasses({
    Com_TestOne_Base.class,
    Com_TestTwo_Base.class,
    Com_TestThree_Base.class,
    Com_TestFour_Base.class,
    Com_TestFive_Base.class,
    Com_TestSix_Base.class,
})
public class Com_Base_Suite {
}

运行此套件的结果是成功的,但实际上没有运行任何测试。所有这些测试都已更新到 JUnit 5 并自行成功运行。

标签: javamavenjunitjunit5

解决方案


您遇到的问题是混合 JUnit 4 和 5 造成的。Maven Surefire 能够开箱即用地运行 JUnit 5(又名 JUnit 平台)测试 - 前提是您在 pom.xml 中有正确的依赖项。有关最小的 pom.xml,请参见例如https://github.com/junit-team/junit5-samples/tree/master/junit5-jupiter-starter-maven

JUnitPlatformSelectClasses等人。允许您通过 JUnit 4 运行 JUnit 平台测试。如果您的构建工具或 IDE 本身不支持 JUnit 平台,您可能只想这样做。JUnit 5 目前没有对类似于 JUnit 4@Suite注释的测试套件的任何明确支持。

我建议您完全摆脱Com_Base_Suite并使用可以通过 Maven<includes>部分配置的命名约定。


推荐阅读