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>
根因分析
报告缺失用例是三个配置错误共同导致的:
- 并行执行时JSON报告文件覆盖:当前surefire插件开启了
parallel=classes+forkMode=perthread+reuseForks=false的多线程执行模式,但Cucumber Runner配置的JSON报告输出路径是固定文件名,多线程同时写同一个文件会导致内容互相覆盖,最终只保留最后写入的部分执行结果。 - 测试执行插件职责冲突:单元测试用例归surefire插件执行,集成测试用例归failsafe插件执行,当前两个插件都配置了扫描同一个Runner类,会导致同一份用例被重复执行两次,报告生成时会混入重复执行的不完整结果。
- 报告插件扫描路径配置错误:当前maven-cucumber-reporting的
inputDirectory直接指向target根目录,没有和JSON报告实际输出路径对齐,会扫描到target目录下其他无关的JSON文件、以及重跑失败用例生成的临时JSON片段,导致最终聚合的报告内容不全。
额外注意:Java 11已经移除了MaxPermSize参数,配置里的-XX:MaxPermSize=256m属于无效参数,会在启动时打印警告日志,不影响核心功能但建议清理。
修复步骤
- 拆分测试执行插件的扫描范围:
- 把所有Cucumber Runner类按测试类型拆分,单元测试级别的Runner放在src/test/java下对应目录,交给surefire插件扫描
- 集成测试级别的Runner统一命名为
*IT.java,交给failsafe插件扫描,禁止两个插件扫描同一个Runner类 - 统一failsafe插件版本,要么保持和声明一致的3.0.0-M4,要么和surefire对齐升级到3.0.0-M7,避免版本差异导致的执行逻辑异常
- 配置多线程执行下的独立报告输出:
在Cucumber Runner的@CucumberOptions注解里,给JSON报告配置带线程唯一标识的输出路径,示例:
每个线程执行时会生成独立的JSON报告文件,不会出现文件覆盖问题。@CucumberOptions( plugin = {"json:target/json-reports/cucumber-${threadId}.json"}, // 原有glue、features等配置保持不变 ) - 修正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> - 把
- 清理surefire插件的无效JVM参数,移除
-XX:MaxPermSize=256m配置,避免启动警告。
完成以上配置后,先执行mvn clean清空旧的构建产物,再执行测试命令,生成的HTML报告就会包含所有用例的完整执行结果。
内容的提问来源于stack exchange,提问作者osman_34
相关产品推荐
相关产品推荐

