You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 16:22:36