如何在Playwright HTML测试报告中展示历史构建结果?
简便实现Playwright测试报告展示上一次Jenkins构建状态的方法
核心思路
避开onTestEnd无法访问test.info()的问题,提前拉取Jenkins历史数据,在测试执行前给每个用例附加上次状态信息,直接展示在HTML报告中。
步骤1:预拉取Jenkins历史构建数据
用Jenkins API获取历史构建的测试结果,存在全局变量中供后续测试用例调用。可以在测试入口文件或playwright.config.js中实现:
const axios = require('axios'); // 存储用例级别上次构建状态,key为用例标题,value为状态(成功/失败) let lastTestCaseStatus = {}; async function fetchJenkinsLastTestResult() { // 替换为你的Jenkins job地址,这里以JUnit测试报告为例 const jenkinsApiUrl = 'http://your-jenkins/job/your-test-job/lastCompletedBuild/testReport/api/json'; // Jenkins账号+API Token转base64认证 const auth = Buffer.from('your-username:your-api-token').toString('base64'); try { const res = await axios.get(jenkinsApiUrl, { headers: { Authorization: `Basic ${auth}` } }); // 遍历所有测试用例,提取上次状态 res.data.suites.forEach(suite => { suite.cases.forEach(testCase => { lastTestCaseStatus[testCase.name] = testCase.status === 'PASSED' ? '✅ 成功' : '❌ 失败'; }); }); } catch (err) { console.error('拉取Jenkins历史数据失败:', err.message); } } // 测试启动前执行一次数据拉取 fetchJenkinsLastTestResult();
步骤2:在测试前置钩子中附加状态到报告
利用test.beforeEach钩子(可正常访问test.info()),将上次构建状态添加到用例的注释或附件中,HTML报告会自动展示这些信息:
import { test } from '@playwright/test'; test.beforeEach(async ({}, testInfo) => { const currentTestTitle = testInfo.title; const lastStatus = lastTestCaseStatus[currentTestTitle] || '🔍 无历史数据'; // 方式1:添加报告注释(会显示在用例详情的Annotations区域) testInfo.annotations.push({ type: '上次构建状态', description: lastStatus }); // 方式2:添加附件(会显示在用例详情的Attachments区域,更醒目) await testInfo.attach('上次构建状态', { body: lastStatus, contentType: 'text/plain' }); });
简化替代方案(全局构建状态)
如果不需要用例级别的细粒度,只需要展示整个构建的上次状态,可直接用Jenkins环境变量:
- 在Jenkins构建任务中,添加环境变量
PREV_BUILD_STATUS,值设为${BUILD_PREVIOUS_BUILD_STATUS}(需确保Jenkins支持该变量,或通过插件获取) - 测试中读取环境变量,同样在
beforeEach中附加到报告:
test.beforeEach(async ({}, testInfo) => { const lastBuildStatus = process.env.PREV_BUILD_STATUS || '未知'; testInfo.annotations.push({ type: '上次构建状态', description: lastBuildStatus }); });
注意事项
- 确保Jenkins API权限足够,API Token需拥有读取构建报告的权限
- 若使用用例级别状态,需Jenkins已配置JUnit等测试报告插件,能输出每个用例的独立结果
- 避免在
onTestEnd中处理,优先用beforeEach完成状态附加,更稳定
内容的提问来源于stack exchange,提问作者Shanjay Nithiin
相关产品推荐
相关产品推荐

