如何生成PDF格式而非HTML的Extent报告(基于Page Object Model)
生成PDF格式Extent报告(POM框架下实现方案)
方案一:使用ExtentReports官方PDF扩展
这是最直接的实现方式,Extent官方提供了PDF导出插件,无需额外处理HTML转译逻辑。
- 引入匹配版本的Maven依赖
<dependency> <groupId>com.aventstack</groupId> <artifactId>extentreports-pdf</artifactId> <version>4.1.5</version> <!-- 替换为你当前使用的ExtentReports版本 --> </dependency>
- 代码中配置PDF报告生成
在测试类的初始化或结束钩子方法中添加如下逻辑:
// 初始化PDF报告器,指定输出路径 ExtentPdfReporter pdfReporter = new ExtentPdfReporter("test-result.pdf"); // 关联报告器到ExtentReports实例 ExtentReports extent = new ExtentReports(); extent.attachReporter(pdfReporter); // 正常编写测试日志(与HTML报告写法完全一致) ExtentTest loginTest = extent.createTest("登录功能验证", "测试用户登录全流程"); loginTest.log(Status.PASS, "用户名输入完成"); loginTest.log(Status.PASS, "密码输入完成"); loginTest.log(Status.PASS, "点击登录按钮,成功跳转至首页"); // 测试结束后刷新报告,自动生成PDF extent.flush();
方案二:HTML转PDF(适配复杂定制需求)
如果官方PDF扩展的样式无法满足需求,可以先生成HTML报告,再通过第三方工具转成PDF,推荐使用Flying Saucer工具。
- 引入Flying Saucer依赖
<dependency> <groupId>org.xhtmlrenderer</groupId> <artifactId>flying-saucer-pdf</artifactId> <version>9.1.22</version> </dependency>
- 实现HTML转PDF逻辑
// 第一步:生成HTML格式的Extent报告 ExtentHtmlReporter htmlReporter = new ExtentHtmlReporter("temp-test-report.html"); ExtentReports extent = new ExtentReports(); extent.attachReporter(htmlReporter); // ... 执行测试用例,添加测试日志 ... extent.flush(); // 第二步:将HTML文件转为PDF File htmlSource = new File("temp-test-report.html"); File pdfOutput = new File("final-test-result.pdf"); ITextRenderer renderer = new ITextRenderer(); renderer.setDocument(new FileInputStream(htmlSource), null); renderer.layout(); renderer.createPDF(new FileOutputStream(pdfOutput)); renderer.finishPDF();
方案三:自定义PDF生成(高度定制场景)
如果需要完全自定义PDF的布局、样式,可以直接使用iText库,结合Extent的测试数据手动构建PDF文档。
- 引入iText依赖
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13.3</version> </dependency>
- 提取Extent测试数据并生成PDF
// 先完成测试流程,生成Extent测试数据 ExtentReports extent = new ExtentReports(); // ... 执行测试用例,添加测试日志 ... extent.flush(); // 初始化iText文档 Document pdfDoc = new Document(); PdfWriter.getInstance(pdfDoc, new FileOutputStream("custom-test-report.pdf")); pdfDoc.open(); // 遍历Extent中的测试用例,写入PDF List<ExtentTest> testCases = extent.getReporter().getExtentTestList(); for (ExtentTest test : testCases) { pdfDoc.add(new Paragraph("测试用例:" + test.getModel().getName())); pdfDoc.add(new Paragraph("状态:" + test.getModel().getStatus().name())); pdfDoc.add(new Paragraph("描述:" + test.getModel().getDescription())); // 写入测试步骤日志 pdfDoc.add(new Paragraph("\n测试步骤:")); for (Log log : test.getModel().getLogs()) { pdfDoc.add(new Paragraph("- " + log.getStatus().name() + ": " + log.getDetails())); } pdfDoc.add(new Paragraph("\n-------------------------\n")); } pdfDoc.close();
注意事项
- 版本兼容性:ExtentReports主版本与PDF扩展版本必须严格匹配,避免出现依赖冲突。
- 截图处理:官方PDF扩展会自动嵌入测试中的截图;HTML转PDF方式需确保截图路径为绝对路径,或Flying Saucer能正确加载相对路径的图片。
- POM框架适配:报告生成逻辑可统一放在测试基类的
@AfterSuite或@AfterTest注解方法中,无需修改页面对象类,保持POM的分层结构。
内容的提问来源于stack exchange,提问作者Ravi Nelluri
相关产品推荐
相关产品推荐

