前言

背景

当小程序自动化用例数量达到一定级别的时候,执行效率是个问题,为了解决效率问题,需要一套可以在多台设备并行执行的方案。

Appium 本身是支持多设备并行执行的(原生应用 CASE 没有问题),但是在遇到小程序自动化的时候,Chromedriver 拖了后腿。

小程序自动化用例有一个特点,就是需要频繁切换上下文,因为在小程序页面中,会有微信原生组件使用,比如定位权限、日期组件等,要想操作这种页面元素,需要切回原生的上下文,操作完成还要再切回 webview。这种频繁切换上下文的操作,在多台设备并行运行的时候,Chromedriver 就会频繁报 500 错误,即使定义了不同的 ChromedriverPort。具体现象可以参考 https://testerhome.com/topics/21644

要解决并行运行的问题,就需要并行运行的时候,把 Chromedriver 做隔离。最初的方案想到了 appium docker,在尝试的过程中,每个 docker machine 需要通过 USB 端口号绑定一台设备,但是设备每插拔一次,端口号就变掉了😭 ,反正我是放弃了。有可行方案的同学可以分享下。

终极解决方案——在极客时间上看了 @ 思寒大神的自动化教程视频,没想到 Jenkins 也可以做测试用例调度,真秀,绝对蒂花之秀。那最终解决方案就是基于 Jenkins 的节点 + 矩阵 JOB,实现小程序自动化用例并行执行。

操作

涉及 Jenkins 配置的一些细节,大家可以参考下思韩大神的极客教程,这里就不赘述了。

在任一一台主机部署即可

操作路径:

Manage Jenkins -> Manage Nodes and Clouds
运行几台设备,就需要建几个节点,每个节点对应一台设备

主要是红框标注的地方,第一个是一台设备只能同时运行一个用例,第二个是设备 ID,在运行的时候传给测试脚本

操作路径:

New Item -> 构建一个多配制项目

标注一:选择已经配置好的节点
标注二:配置需要执行的测试用例

Jenkins 会把每个子 JOB 的结果收集起来生成一个完整的报告 💯
都是常规的配置,大家可以参考下

通过 os.getenv 方法获取设备 ID
不同主机的 appium 服务地址与 Chromedriver 路径可以从本地配置中获取

不同用例在不同设备上运行,完美解决运行效率问题 💯

Q&A

在最初调研方案的时候,有三个可以选择,分别是 airtest、appium、FAT。

FAT 有微信版本限制,直接放弃。

airtest,的确很强大,而且也有多设备并行执行的方案(不知道的可以参考 https://testerhome.com/topics/20326),但是基于图像识别与文本定位并不适合我们的自动化需求,因为我们需要更精准的元素定位。

所以最后直接选择了 appium,当初也不知道多设备运行的坑 😭

额,只能说能力、时间有限,只能从入门到放弃了。当然有实践成功的同学,求分享!! 毕竟技多不压身哈 😆

最后

第一次发帖,有不对和需要改进的地方,欢迎大家指正。
再次感谢 @ 思寒大神的教程,有兴趣大家都去围观一下吧!!


↙↙↙阅读原文可查看相关链接,并与作者交流