作者 | 赵里京
UI 自动化我们都了解可以模拟用户真正的使用场景和用户行为,而边界、异常等场景接口测试更加适合。那么实现了 UI 自动化是否就可以完全代替手工用例去执行测试任务。理论上没有错,但总是理想很丰满,现实很骨感。在做 UI 自动化时总会有那么多的问题阻碍了我们目标的实现:
Puppeteer 是谷歌官方出品的一个通过 DevTools 协议控制 headless Chrome 的 Node 库,注意它只是一个 node 库,所以环境以及使用都很方便。我们可以通过 Puppeteer 提供的 API 直接控制浏览器,模拟大部分用户操作来进行 UI Test 或者作为爬虫访问页面来收集数据。
Puppeteer 能做什么?
就不说了,网上海量资料供你选择
多人协作一定要考虑维护的成本,工程的框架设计至关重要。结构清晰简单其他人维护的成本就会降低,下图为转转客服 UI 用例工程结构图:
主要是用 Puppeteer+Mocha(摩卡)组合,Mocha 与 testNG 的作用很像,主要也是用于单元测试的测试框架,也有测试套件等定义,以及用例控制功能。
上图第一层为用例的测试套件,一定要放置在工程的 test 文件夹下,下图中存在两个测试套件分别为 IMmainProcess.test.js 和 WorkOrderIM.test.js。mocha.opts 文件里写 mocha 执行命令的参数,如生成报告、执行方式等参数。
describe 定义测试套件名称,it 定义单个测试用例,Mocha 同时提供了 only,skip 等控制用例执行方法和钩子函数 before(),after() 等。
(mocha 生成的测试报告样式)
结构图中的逻辑层封装了逻辑变化校验,里面有大量的 if else 逻辑。如果触发一个动作后,会将页面实例传给逻辑变化模块进行校验,去判断当前页面是哪一种情况,进而来进行下一个动作,这就是前面说的用例健壮性的问题。当然在用例的什么位置加校验要通过个人的经验来判断。
业务逻辑中封装了浏览器实例减少重复代码,以及特定的业务逻辑。元素库主要封装的是 global 形式的页面元素常量。
最后就是经常用到的工具方法,比如 httpclient,dbserver,以及发送邮件发送报警等工具。这些方法已经逐步封装成了 API,其他同学只需下载 npm 包即可使用,使 QA 能将更多的精力放在用例逻辑的开发中。
目前客服 UI 自动化用例同时肩负着监控线上客服系统功能回归的任务,并随之开发了用例配套系统 “UI 用例监控系统”,系统的核心仍然是 “用例”。当执行线上用例失败后,系统首先会截取当前浏览器的快照,并将快照与异常结果一同上报至平台,同时发送报警信息给相关负责人。下图为系统中异常的记录,主要有异常信息、发生时间、执行人(获取的是系统用户名)、操作以及截屏图片等。
操作的备注功能功能主要是对异常数据人工打标,上报的数据将和标注后的数据进行对比。标注有两个属性分别为是否为 bug 与类别,如下图:
新产生的异常首先与库中异常数据进行比较,匹配后再以图片进行比较。如果均匹配成功则自动补充样本的标注信息,如果未匹配则不补充。同时如果与不是 bug 的匹配成功的话则不发报警信息,来减少误报情况。
系统核心模块如下图:
系统还有一些其他功能:
客服系统核心功能之一是用户与机器人交互与人工客服聊天,最初的测试方式是采用 java 创建多个 WebSocketClient 与服务端建立连接,写心跳逻辑与服务端保持连接,进而模拟消息发送与接收。全场景用例写好后,相当于写好了一个没有页面的用户端,成本非常高。
而使用 Puppeteer 实现 WebSocket 场景就相当简单了,可以快速创建多个 Chrome 实例模拟多个用户登陆并与机器人进行交互、申请人工,客服优先级接待等复杂场景。这些多用户场景用手动测试很难,但使用 UI 自动化还是非常理想的。目前这些复杂场景用例,已经提供开发自测或者执行冒烟用例时使用。