带有 @Suite 注释的 Junit5 测试套件不使用 mvn test 命令执行测试

Posted

技术标签:

【中文标题】带有 @Suite 注释的 Junit5 测试套件不使用 mvn test 命令执行测试【英文标题】:Junit5 test suites with @Suite annotation doesn't execute tests with mvn test command 【发布时间】:2022-01-14 20:24:28 【问题描述】:

我们打算将基于 JUnit4 的项目升级到 JUnit5。我根据JUnit5官网的说明修改了JUnit4套件:https://junit.org/junit5/docs/current/user-guide/#running-tests-junit-platform-runner-test-suite。 在命令行中使用 mvn test 时未执行测试:mvn test -Dtest=SuiteXXTest,无论是在 JUnit4 还是 JUnit5 套件中。 错误信息:[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:3.0.0-M5:test (default-test) on project XXX: No tests were executed! 然而,JUnit4 和 JUnit5 套件都可以运行和执行 IDEA 中包含的测试。 Maven surefire 插件版本是3.0.0-M5。单个测试类(ATest 和 BTest)基于 JUnit4 编程模型。

旧的 JUnit4 套件是这样的:

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import test.XX.*;

@RunWith(Suite.class)
@Suite.SuiteClasses(
        ATest.class,
        BTest.class
)
public class SuiteXXTest 

修改为:

import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;
import test.XX.*;

@Suite
@SelectClasses(
            ATest.class,
            BTest.class
)
public class SuiteXXTest 


相关依赖:

<dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.8.2</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
        <version>5.8.2</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-suite</artifactId>
        <version>1.8.2</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>

奇怪的是,如果我使用已弃用的 @RunWith(JUnitPlatform.class) 注释,测试套件可以正确执行。但是根据JUnit5官方用户指南,使用这个运行器意味着测试将在JUnit4环境中执行,我不明白什么条件被认为是JUnit4环境(在pom中已经配置了JUnit5依赖)。

我不知道这是一个错误还是我的错误使用。

【问题讨论】:

我也试过修改ATest和BTest为JUnit5编程模型,还是不行。 【参考方案1】:

在这里找到解决方案:https://github.com/junit-team/junit5/discussions/2753。

根据这个答案,我刚刚将我的命令从-Dtest=SuiteXXTest 更改为-Dinclude=SuiteXXTest,它工作正常。我认为这与surefire插件有关。使用-Dtest 命令时,似乎surefire 无法从带有@Suite 注释的套件中提取测试。

【讨论】:

【参考方案2】:

RunWith 是 JUnit 4 构造,不适用于 JUnit 5。请改用 JUnit 平台套件,如 https://junit.org/junit5/docs/current/user-guide/#junit-platform-suite-engine 中所述

【讨论】:

我在 JUnit5 编程风格套件中遇到的问题是:import org.junit.platform.suite.api.SelectClasses;导入 org.junit.platform.suite.api.Suite;导入 test.XX.*; @Suite @SelectClasses( ATest.class, BTest.class ) 公共类 SuiteXXTest 评论中的代码不可读。如果相关,请将其添加到您的问题中。您是否阅读过链接并尝试过?如果是,究竟是什么不起作用? 抱歉代码不可读。它与我上面描述的 JUnit5 样式套件相同。在发布此问题之前,我实际上已经阅读了您提供的链接。我的 pom.xml 中已经使用了 junit-platform-suite,而 junit-platform-suite-engine 是它的传递依赖项。问题是 JUnit5 风格的带有 @Suite 注释的测试套件不会在“mvn test -Dtest=SuiteXXTest”之类的命令中执行测试。

以上是关于带有 @Suite 注释的 Junit5 测试套件不使用 mvn test 命令执行测试的主要内容,如果未能解决你的问题,请参考以下文章

全网最全:Junit5的@Suite注解-上

第八章:Junit——TestSuite 的测试套件的理解

Junit5-木星所有测试套件@BeforeAll @AfterAll 不工作

运行测试套件无法通过 maven 在 junit5 中运行

Junit5套件执行

Python+Selenium笔记:unittest的Test Suite(测试套件)