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

如何生成PDF格式而非HTML的Extent报告(基于Page Object Model)

生成PDF格式Extent报告(POM框架下实现方案)

方案一:使用ExtentReports官方PDF扩展

这是最直接的实现方式,Extent官方提供了PDF导出插件,无需额外处理HTML转译逻辑。

  1. 引入匹配版本的Maven依赖
<dependency>
    <groupId>com.aventstack</groupId>
    <artifactId>extentreports-pdf</artifactId>
    <version>4.1.5</version> <!-- 替换为你当前使用的ExtentReports版本 -->
</dependency>
  1. 代码中配置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工具。

  1. 引入Flying Saucer依赖
<dependency>
    <groupId>org.xhtmlrenderer</groupId>
    <artifactId>flying-saucer-pdf</artifactId>
    <version>9.1.22</version>
</dependency>
  1. 实现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文档。

  1. 引入iText依赖
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13.3</version>
</dependency>
  1. 提取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:53:15