如何在Cucumber+TestNG(Java)中为不同Runner类生成独立Extent报告
解决方案
一、修复多Runner生成独立报告的问题
1. 拆分TestNG Suite执行
将多个Runner类分配到不同的TestNG Suite中,避免共享Cucumber运行上下文导致报告覆盖。修改testng.xml如下:
<suite name="Tag1-Suite"> <test name="Tag1-Tests"> <classes> <class name="your.package.Runner1"/> </classes> </test> </suite> <suite name="Tag2-Suite"> <test name="Tag2-Tests"> <classes> <class name="your.package.Runner2"/> </classes> </test> </suite>
2. 手动初始化Extent报告
放弃仅通过@CucumberOptions配置插件,改为在Runner类中手动初始化Extent报告,确保每个Runner独立生成报告:
Runner1.java
@RunWith(Cucumber.class) @CucumberOptions( features = "src/test/resources/features", glue = "your.package.stepdefs", tags = "@Tag1", plugin = {"pretty"} // 移除原Extent插件配置 ) public class Runner1 { @BeforeSuite public void initExtentReport() { // 初始化专属报告路径 ExtentCucumberFormatter.initiateExtentReporter("target/cucumber-reports/report1.html"); // 加载自定义配置(可选,需提前准备extent-config.xml) ExtentCucumberFormatter.loadConfig(new File("src/test/resources/extent-config.xml")); } }
Runner2.java
@RunWith(Cucumber.class) @CucumberOptions( features = "src/test/resources/features", glue = "your.package.stepdefs", tags = "@Tag2", plugin = {"pretty"} ) public class Runner2 { @BeforeSuite public void initExtentReport() { ExtentCucumberFormatter.initiateExtentReporter("target/cucumber-reports/report2.html"); ExtentCucumberFormatter.loadConfig(new File("src/test/resources/extent-config.xml")); } }
二、解决报告体积过大无法上传JIRA的问题
1. 压缩截图体积
在截图逻辑中加入PNG压缩处理,降低单张截图大小:
// 示例:使用Thumbnails库压缩截图(需引入依赖) Thumbnails.of(screenshotFile) .scale(0.8) // 缩放至原尺寸80% .outputQuality(0.6) // 输出质量60% .toFile(new File(targetPath));
若不想引入第三方库,可通过Java原生ImageIO调整图片参数实现压缩。
2. 按功能/标签拆分更小的报告
将600个场景进一步拆分,比如按业务模块划分成多个Runner(每个Runner对应200个以内场景),生成多个小体积报告,单个压缩包大小控制在JIRA允许范围内。
3. 避免报告嵌入截图
确保Extent报告使用外部截图引用而非Base64嵌入(旧版ExtentCucumberFormatter默认是外部引用),这样HTML文件本身体积不会过大,仅需压缩截图文件夹+报告文件即可。
4. 执行前清理旧文件
在Runner的@BeforeSuite中加入清理逻辑,删除target目录下旧的报告和截图,避免累积旧文件导致体积增大:
@BeforeSuite public void cleanOldFiles() { File reportDir = new File("target/cucumber-reports"); File screenshotDir = new File("target/screenshot"); // 递归删除目录下所有文件 deleteDir(reportDir); deleteDir(screenshotDir); } private boolean deleteDir(File dir) { if (dir.isDirectory()) { String[] children = dir.list(); for (String child : children) { boolean success = deleteDir(new File(dir, child)); if (!success) { return false; } } } return dir.delete(); }
内容的提问来源于stack exchange,提问作者BRD
相关产品推荐
相关产品推荐

