我遇到了以下问题,我有使用 JUNIT Testign 框架的 Rest Assured API 测试,我添加了一个 TestExecutionListener 来打印有关已执行测试的详细信息。 然而,当我通过 Maven 命令运行测试时:
`mvn test -Duri=http://localhost:8000/api`
这个 TestExecutionListener 没有被触发。
当我通过按 IntelliJIDEA 上的“Play”按钮运行测试类时,会触发 TestExecutionListener。 当我使用 maven 命令再次运行它时,它也会被触发。
所以,问题仅在于第一次使用 maven 命令运行测试时,然后在本地运行后,一切都得到了修复,但这对我来说不是一个解决方案,因为我需要 第一次尝试 Maven 命令时要运行的所有内容,因为测试是作为 CI/CD Pipeline 的单独作业运行的。 我已经验证我的项目使用的是 JAVA 8,并且我的 JAVA HOME PATH 也指向 HJAVA8
不确定这是否有帮助,但会在此处添加我拥有的侦听器以及 org.junit.platform.launcher.TestExecutionListener 文件
org.junit.platform.launcher.TestExecutionListener:
utils.listeners.RunnerExtension
public class RunnerExtension implements TestExecutionListener {
@Override
public void testPlanExecutionStarted(TestPlan testPlan) {
System.out.println("========STARTING============");
}
@Override
public void testPlanExecutionFinished(TestPlan testPlan) {
System.out.println("========FINISHING=============");
}
我尝试使用 Maven 命令 mvn test -Duri=http://localhost:8000/api 运行测试,并期望 实现要触发的 TestExecutionListener 的 RunnerExtension。但它没有被触发。 仅当我直接通过 IntelliJ Idea 运行测试时才会触发它
附加信息: java版本 openjdk 版本“1.8.0_292” OpenJDK 运行时环境 (AdoptOpenJDK)(build 1.8.0_292-b10) OpenJDK 64 位服务器 VM (AdoptOpenJDK)(build 25.292-b10,混合模式)
mvn——版本 Apache Maven 3.9.6 (bc0240f3c744dd6b6ec2920b3cd08dcc295161ae) Maven主页:/usr/local/Cellar/maven/3.9.6/libexec Java 版本:1.8.0_292,供应商:AdoptOpenJDK,运行时:/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/jre 平台编码:UTF-8 操作系统名称:“mac os x”,版本:“10.16”,架构:“x86_64”,系列:“mac”
== 我还在两种情况下运行了 mvn test -X -Duri=http://localhost:8000/api` 当 TestExecutionListener 被触发和未被触发时,我没有注意到日志有任何差异,所以 ib 这两种情况都是使用相同的库,
== pom.xml文件如下;
...
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<restassured.version>4.0.0</restassured.version>
<junit.version>5.7.2</junit.version>
<junit.dataprovider.version>2.4</junit.dataprovider.version>
<allure-maven.version>2.10.0</allure-maven.version>
<allure-junit5.version>2.14.0</allure-junit5.version>
<maven-surefire-plugin.version>3.0.0-M4</maven-surefire-plugin.version>
<aspectj.version>1.9.6</aspectj.version>
<allure.version>2.17.1</allure.version>
<allure.cmd.download.url>
https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline
</allure.cmd.download.url>
<wiremock.version>2.23.2</wiremock.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<properties>
<configurationParameters>
junit.jupiter.conditions.deactivate = *
junit.jupiter.extensions.autodetection.enabled = true
junit.jupiter.testinstance.lifecycle.default = per_class
</configurationParameters>
</properties>
<systemPropertyVariables>
<allure.results.directory>target/allure-results</allure.results.directory>
</systemPropertyVariables>
<argLine>
-javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
</argLine>
</configuration>
<dependencies>....
<dependencies>
感谢 @Twaldigas 在相关主题下的评论,我找到了解决方案 JUnit 5:是否可以在 Maven Surefire 插件中设置 TestExecutionListener?
我使用了这个库: https://github.com/google/auto/tree/main/service (必须添加新的依赖项并更新 maven-compiler-plugin 的配置,无论如何,它在他们的文档中进行了描述)
然后我在实现 TestExecutionListener 的类中添加了注释 所以我的代码如下所示:
import org.junit.platform.launcher.TestExecutionListener;
import com.google.auto.service.AutoService;
@AutoService(TestExecutionListener.class)
public class RunnerExtension implements TestExecutionListener {
@Override
public void testPlanExecutionStarted(TestPlan testPlan) {
System.out.println("========STARTING============");
}
@Override
public void testPlanExecutionFinished(TestPlan testPlan) {
System.out.println("========FINISHING=============");
}
通过这种方法,文件 META-INF/services/org.junit.platform.launcher.TestExecutionListen
根本不需要!