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

Selenium集成Cucumber生成HTML报告无法展示全部测试结果

问题背景

Java技术栈Selenium自动化测试项目集成Cucumber框架,已完成pom.xml依赖与插件配置,引入依赖版本如下:

  • Java 11
  • Selenium-java 4.2.2
  • webdrivermanager 5.2.1
  • cucumber-java 7.3.4
  • cucumber-junit 7.3.4

配置的Maven插件版本如下:

  • maven-resources-plugin 3.1.0
  • maven-failsafe-plugin 3.0.0-M4(实际配置中写入版本为3.0.0-M7)
  • maven-surefire-plugin 3.0.0-M7
  • maven-cucumber-reporting 5.0.0

执行测试后生成的Cucumber HTML报告仅展示失败用例、或不同测试类的部分用例结果,无法查看全部用例的完整执行结果,当前pom.xml插件配置如下:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>3.1.0</version>
</plugin>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>3.0.0-M7</version>
    <configuration>
        <testFailureIgnore>true</testFailureIgnore>
        <skipTests>false</skipTests>
        <includes>
            <include>**/runners/Smoke1TestRunner.java</include>
        </includes>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.0.0-M7</version>
    <configuration>
        <rerunFailingTestsCount>2</rerunFailingTestsCount>
        <parallel>classes</parallel>
        <forkMode>perthread</forkMode>
        <threadCount>${se.threadCount}</threadCount>
        <perCoreThreadCount>false</perCoreThreadCount>
        <reuseForks>false</reuseForks>
        <argLine>-Duser.language=en</argLine>
        <argLine>-Xmx1024m</argLine>
        <argLine>-XX:MaxPermSize=256m</argLine>
        <argLine>-Dfile.encoding=UTF-8</argLine>
        <useFile>false</useFile>
        <includes>
            <include>**/runners/Smoke1TestRunner.java</include>
        </includes>
        <testFailureIgnore>true</testFailureIgnore>     
    </configuration>
</plugin> 
<plugin>
    <groupId>net.masterthought</groupId>
    <artifactId>maven-cucumber-reporting</artifactId>
    <version>5.0.0</version>
    <executions>
        <execution>
            <id>execution</id>
            <phase>verify</phase>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <projectName>cucumber-jvm-example</projectName>
                <outputDirectory>${project.build.directory}</outputDirectory>
                <inputDirectory>${project.build.directory}</inputDirectory>
                <jsonFiles>
                    <param>**/json-reports/*.json</param>
                </jsonFiles>
                <classificationFiles>
                    <param>sample.properties</param>
                    <param>other.properties</param>
                </classificationFiles>
                <checkBuildResult>true</checkBuildResult>
            </configuration>
        </execution>
    </executions>
</plugin>
根因分析

报告缺失用例是三个配置错误共同导致的:

  1. 并行执行时JSON报告文件覆盖:当前surefire插件开启了parallel=classes + forkMode=perthread + reuseForks=false的多线程执行模式,但Cucumber Runner配置的JSON报告输出路径是固定文件名,多线程同时写同一个文件会导致内容互相覆盖,最终只保留最后写入的部分执行结果。
  2. 测试执行插件职责冲突:单元测试用例归surefire插件执行,集成测试用例归failsafe插件执行,当前两个插件都配置了扫描同一个Runner类,会导致同一份用例被重复执行两次,报告生成时会混入重复执行的不完整结果。
  3. 报告插件扫描路径配置错误:当前maven-cucumber-reporting的inputDirectory直接指向target根目录,没有和JSON报告实际输出路径对齐,会扫描到target目录下其他无关的JSON文件、以及重跑失败用例生成的临时JSON片段,导致最终聚合的报告内容不全。

额外注意:Java 11已经移除了MaxPermSize参数,配置里的-XX:MaxPermSize=256m属于无效参数,会在启动时打印警告日志,不影响核心功能但建议清理。

修复步骤
  1. 拆分测试执行插件的扫描范围:
    • 把所有Cucumber Runner类按测试类型拆分,单元测试级别的Runner放在src/test/java下对应目录,交给surefire插件扫描
    • 集成测试级别的Runner统一命名为*IT.java,交给failsafe插件扫描,禁止两个插件扫描同一个Runner类
    • 统一failsafe插件版本,要么保持和声明一致的3.0.0-M4,要么和surefire对齐升级到3.0.0-M7,避免版本差异导致的执行逻辑异常
  2. 配置多线程执行下的独立报告输出:
    在Cucumber Runner的@CucumberOptions注解里,给JSON报告配置带线程唯一标识的输出路径,示例:
    @CucumberOptions(
        plugin = {"json:target/json-reports/cucumber-${threadId}.json"},
        // 原有glue、features等配置保持不变
    )
    
    每个线程执行时会生成独立的JSON报告文件,不会出现文件覆盖问题。
  3. 修正maven-cucumber-reporting配置:
    • 把inputDirectory配置为JSON报告实际存放的目录,即${project.build.directory}/json-reports
    • 移除不存在的classificationFiles配置(如果项目中没有sample.properties和other.properties两个文件,插件会抛出异常中断执行,直接影响报告生成)
      修正后的报告插件配置参考:
    <plugin>
        <groupId>net.masterthought</groupId>
        <artifactId>maven-cucumber-reporting</artifactId>
        <version>5.0.0</version>
        <executions>
            <execution>
                <id>execution</id>
                <phase>verify</phase>
                <goals>
                    <goal>generate</goal>
                </goals>
                <configuration>
                    <projectName>cucumber-jvm-example</projectName>
                    <outputDirectory>${project.build.directory}/cucumber-report</outputDirectory>
                    <inputDirectory>${project.build.directory}/json-reports</inputDirectory>
                    <jsonFiles>
                        <param>*.json</param>
                    </jsonFiles>
                    <checkBuildResult>false</checkBuildResult>
                </configuration>
            </execution>
        </executions>
    </plugin>
    
  4. 清理surefire插件的无效JVM参数,移除-XX:MaxPermSize=256m配置,避免启动警告。

完成以上配置后,先执行mvn clean清空旧的构建产物,再执行测试命令,生成的HTML报告就会包含所有用例的完整执行结果。

内容的提问来源于stack exchange,提问作者osman_34

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 11:18:16