如何阻止allure-junit5为Cucumber7测试生成重复报告?
解决Cucumber7与JUnit5 Allure报告重复问题
方法1:通过JUnit5标签+分阶段执行实现隔离
给API测试统一添加专属标签,让allure-junit5仅处理带标签的API测试;同时单独配置Cucumber测试的执行逻辑,由allure-cucumber7-jvm处理,最后合并两类测试的结果生成统一报告。
步骤1:给API测试添加标签
给所有纯JUnit编写的API测试类添加自定义标签(比如@ApiTest):
import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @Tag("ApiTest") public class UserApiTest { @Test void testGetUserInfo() { // API测试逻辑 } }
步骤2:配置Maven Surefire插件分阶段执行
在pom.xml中配置两个Surefire执行块,分别处理API测试和Cucumber测试,指定不同的Allure结果目录:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.1.2</version> <!-- 处理API测试:仅运行带ApiTest标签的用例 --> <executions> <execution> <id>api-tests</id> <phase>test</phase> <goals> <goal>test</goal> </goals> <configuration> <includes> <include>**/*ApiTest.java</include> </includes> <properties> <configurationParameters> junit.jupiter.tags.include=ApiTest </configurationParameters> </properties> <argLine> -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar" </argLine> <systemProperties> <property> <name>allure.results.directory</name> <value>${project.build.directory}/allure-results-api</value> </property> </systemProperties> </configuration> </execution> <!-- 处理Cucumber测试:仅运行Cucumber启动类 --> <execution> <id>cucumber-tests</id> <phase>test</phase> <goals> <goal>test</goal> </goals> <configuration> <includes> <include>**/RunCucumberTest.java</include> </includes> <argLine> -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar" </argLine> <systemProperties> <property> <name>allure.results.directory</name> <value>${project.build.directory}/allure-results-cucumber</value> </property> </systemProperties> </configuration> </execution> </executions> </plugin>
步骤3:合并Allure报告
在allure-maven-plugin中配置合并两个结果目录:
<plugin> <groupId>io.qameta.allure</groupId> <artifactId>allure-maven-plugin</artifactId> <version>2.19.0</version> <configuration> <resultsDirectory>${project.build.directory}/allure-results-api,${project.build.directory}/allure-results-cucumber</resultsDirectory> </configuration> </plugin>
方法2:自定义Allure JUnit5监听器过滤Cucumber测试
编写自定义监听器,判断测试类是否为Cucumber测试(通过@Cucumber注解识别),如果是则跳过allure-junit5的报告生成逻辑。
步骤1:实现自定义监听器
import io.qameta.allure.junit5.AllureJunit5; import org.junit.jupiter.api.extension.ExtensionContext; import io.cucumber.junit.platform.engine.Cucumber; public class CucumberFilteredAllureJunit5 extends AllureJunit5 { @Override public void beforeEach(ExtensionContext context) { // 跳过带有Cucumber注解的测试类 if (context.getRequiredTestClass().isAnnotationPresent(Cucumber.class)) { return; } super.beforeEach(context); } @Override public void afterEach(ExtensionContext context) { if (context.getRequiredTestClass().isAnnotationPresent(Cucumber.class)) { return; } super.afterEach(context); } }
步骤2:替换默认Allure JUnit5监听器
修改Surefire插件配置,启用自定义监听器:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <argLine> -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar" </argLine> <properties> <configurationParameters> junit.jupiter.extensions.classnames=com.yourpackage.CucumberFilteredAllureJunit5 </configurationParameters> </properties> </configuration> </plugin>
方法3:临时方案——通过报告名称过滤
如果不想修改代码或复杂配置,可以在生成Allure报告时,排除Cucumber测试生成的条目(Cucumber测试名称通常包含Scenario、Feature文件名等特征):
<plugin> <groupId>io.qameta.allure</groupId> <artifactId>allure-maven-plugin</artifactId> <version>2.19.0</version> <configuration> <filters> <filter> <exclude>.*Scenario.*</exclude> <exclude>.*LoginFeature.*</exclude> <!-- 替换为你的Feature文件名特征 --> </filter> </filters> </configuration> </plugin>
注意:该方法依赖测试名称格式,稳定性不如前两种,适合临时快速修复。
内容的提问来源于stack exchange,提问作者Corentin CANIN
相关产品推荐
相关产品推荐

