Playwright自定义测试报告,并与钉钉,企微,飞书集成

2,701 阅读4分钟

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来提交信息,只是接口功能异同而已。

更详细的集成代码可以参考

办公协同工具集成总结

本次通过国内国外几大协同办公工具的集成,也有一些体会

  • 接口文档,国外几个基本都一致的提供准确易懂的官方文档。
  • 最乱的是钉钉,搜索到无数个官方文档,而且都不一样,不知道哪个能用,感觉这些文档是AI写的么,或者经历了无数个团队写的,失效就不能删掉么。最后才发现一个大概能用了,但里面举例的代码,可能不是接口设计者写的,也许也没有验证过,看完的感觉就是会不会写代码,根本无法帮助解决问题,一言难尽。
  • 企业微信在外面搜不到文档,因为需要直接在企业微信的应用里面去打开对应的文档,这是有多么的保守,连发个文档链接给别人看都不行。好在文档本身相对比较容易懂,也能解决问题,至少不是和钉钉一样大海捞针。
  • 飞书的话,比钉钉好点,但写文档的人也是完全不考虑使用者体会的,写了10几年的代码,很多时候看不懂接口文档的例子代码。普遍的感觉就是,提供了接口文档但你爱用不用。官方提供的例子,要经过无数次变着法子的测试,才能找到能通的,最终的感觉就是,哦,原来要改成这样才能调用成功。
  • 开放能力的话,钉钉是最差的,目前只能发文本信息,但不知道如何发图片,也许是没找到对地方。