带有 @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 命令执行测试的主要内容,如果未能解决你的问题,请参考以下文章