Playwright是新一代Web自动化测试框架,有着极致的测试速度,今天分享一下如何给Playwright自定义测试报告。
Playwright官方测试报告
在介绍自定义报告前,先了解官方提供的测试报告
- List
- Line
- Dot
- HTML
- JSON
- JUnit
- GitHub
list和html是最常用测试报告,list就是直接在终端输出测试信息,html将会产生一套html的网页报告。line和dot是list的简化版,json和junit是提供给特定的json和xml纯数据报告使用的,GitHub 自然就是给GitHub Actions使用的,毕竟GitHub也是微软的。
Playwright是支持多个报告一起使用的,平常一般选择多个进行搭配使用
// playwright.config.js
import { defineConfig } from '@playwright/test';
export default defineConfig({
reporter: [
['list'],
['html', { open: 'never' }]
]
});
多个的情况变成使用数组,每个报告也使用数组,第一项是报告id名,第二项是可选项,为报告的设置。
自定义测试报告
官方的测试报告,基本可以满足开发的时候,也就是编写和实现测试的需要。但很多时候,测试结果还需要分享到不同团队或人员,甚至入库等,而且测试也不是在本地环境运行的,需要集成到DevOps链条中,这样就需要根据自身业务和条件定制适合自己的测试报告,这里Playwright提供了一套hooks的接口给自定义测试报告使用
class MyReporter {
constructor(options) {
// 报告需要的选项
console.log(options);
this.options = options;
}
// 常用4个hooks
onBegin(config, suite) {
console.log(`整体测试开始 ${suite.allTests().length} tests`);
}
onEnd(result) {
console.log(`整体测试结束: ${result.status}`);
}
onTestBegin(test) {
console.log(`单个测试开始 ${test.title}`);
}
onTestEnd(test, result) {
console.log(`单个测试结束 ${test.title}: ${result.status}`);
}
// 其他不常用的hooks
// onStdErr onStdOut, 这两个可以用来记录输出日志,但为了保障输出的顺序,需要将两个结合到一起,并主要重试的问题
// onStepBegin,onStepEnd 单个步骤开始和结束
// onError 出现未知错误,可能是测试终止,系统问题等
// onExit 这个新版才提供的,会在测试退出前调用,也就是所有的测试报告的onEnd都完成后
// printsToStdio 表示该报告是否需要对应的终端输出,以提高用户体验
}
export default MyReporter;
更多详细的接口见官方文档 playwright.dev/docs/api/cl…
有了这些hooks就可以自己收集测试数据,并生成测试报告,最后在结束的时候,处理分析数据,并发送报告
与钉钉,企微,飞书集成
在项目快速迭代过程中,测试快,报告也要快,要及时反映问题。以前可能使用email邮件来发送测试报告,或者集中管理到testrail或者Jira这样的工具中。现在可能更多是使用IM工具,直接发送到相关测试群里。国外流行的工具是Slack,Teams或Discord这些,国内基本就是钉钉,企微或飞书。
前面已经介绍了自定义报告可以用来收集测试数据,这里就省略直接使用第三方测试报告monocart-reporter已经收集的测试数据来举例如何和IM集成
这里以钉钉举例,钉钉开放接口有提供webhook接口来使用钉钉机器人向特定的群发送信息,所以测试结束的时候,使用webhook直接将测试结果的概要推送到钉钉群即可,提前需要添加钉钉机器人并设置好webhook
// playwright.config.js
import axios from 'axios';
import EC from 'eight-colors';
import dotenv from 'dotenv';
// 这里使用dotenv来读取环境变量,毕竟一些带token的链接比如webhook尽量不要公开
dotenv.config();
export default {
testDir: './tests',
outputDir: `./test-reports`,
reporter: [
['list'],
['monocart-reporter', {
name: "My Test Report",
outputFile: `./test-reports/index.html`,
onEnd: async (reportData, capability) => {
// 从环境变量读取钉钉的webhook地址
const url = process.env.DINGTALK_WEBHOOK;
const {
name, dateH, durationH, summary
} = reportData;
const lines = [`## ${name}`, `> ${dateH} (${durationH})`];
['tests', 'passed', 'flaky', 'skipped', 'failed'].forEach((k) => {
const item = summary[k];
const percent = item.percent ? ` (${item.percent})` : '';
lines.push(`- **${item.name}** ${item.value} ${percent}`);
});
lines.push('\n ');
if (summary.passed.value === summary.tests.value) {
lines.push('✔ 恭喜,测试全部通过.');
}
const data = {
'msgtype': 'markdown',
'markdown': {
'title': 'My Test Report',
'text': lines.join('\n')
}
};
const res = await axios.post(url, data).catch((err) => {
// console.log(err);
EC.logRed(err.message);
EC.logRed('[dingtalk] 发送信息失败');
});
if (res) {
console.log(res.data);
}
}
}]
]
};
企业微信和飞书也提供类似的webhook来提交信息,只是接口功能异同而已。
- 企业微信的webhook提供dataur的图片支持,还提供直接上传文件附件,也就是可以将html报告直接发送到微信的群里
- 飞书的webhook可以以formdata的形式上传图片,但这项权限需要在开发平台审核批准,详情见 自定义机器人指南 - 客户端文档 - 开发文档 - 飞书开放平台 (feishu.cn)
更详细的集成代码可以参考
办公协同工具集成总结
本次通过国内国外几大协同办公工具的集成,也有一些体会
- 接口文档,国外几个基本都一致的提供准确易懂的官方文档。
- 最乱的是钉钉,搜索到无数个官方文档,而且都不一样,不知道哪个能用,感觉这些文档是AI写的么,或者经历了无数个团队写的,失效就不能删掉么。最后才发现一个大概能用了,但里面举例的代码,可能不是接口设计者写的,也许也没有验证过,看完的感觉就是会不会写代码,根本无法帮助解决问题,一言难尽。
- 企业微信在外面搜不到文档,因为需要直接在企业微信的应用里面去打开对应的文档,这是有多么的保守,连发个文档链接给别人看都不行。好在文档本身相对比较容易懂,也能解决问题,至少不是和钉钉一样大海捞针。
- 飞书的话,比钉钉好点,但写文档的人也是完全不考虑使用者体会的,写了10几年的代码,很多时候看不懂接口文档的例子代码。普遍的感觉就是,提供了接口文档但你爱用不用。官方提供的例子,要经过无数次变着法子的测试,才能找到能通的,最终的感觉就是,哦,原来要改成这样才能调用成功。
- 开放能力的话,钉钉是最差的,目前只能发文本信息,但不知道如何发图片,也许是没找到对地方。