当小程序自动化用例数量达到一定级别的时候,执行效率是个问题,为了解决效率问题,需要一套可以在多台设备并行执行的方案。
Appium 本身是支持多设备并行执行的(原生应用 CASE 没有问题),但是在遇到小程序自动化的时候,Chromedriver 拖了后腿。
小程序自动化用例有一个特点,就是需要频繁切换上下文,因为在小程序页面中,会有微信原生组件使用,比如定位权限、日期组件等,要想操作这种页面元素,需要切回原生的上下文,操作完成还要再切回 webview。这种频繁切换上下文的操作,在多台设备并行运行的时候,Chromedriver 就会频繁报 500 错误,即使定义了不同的 ChromedriverPort。具体现象可以参考 https://testerhome.com/topics/21644。
要解决并行运行的问题,就需要并行运行的时候,把 Chromedriver 做隔离。最初的方案想到了 appium docker,在尝试的过程中,每个 docker machine 需要通过 USB 端口号绑定一台设备,但是设备每插拔一次,端口号就变掉了 ,反正我是放弃了。有可行方案的同学可以分享下。
终极解决方案——在极客时间上看了 @ 思寒大神的自动化教程视频,没想到 Jenkins 也可以做测试用例调度,真秀,绝对蒂花之秀。那最终解决方案就是基于 Jenkins 的节点 + 矩阵 JOB,实现小程序自动化用例并行执行。
涉及 Jenkins 配置的一些细节,大家可以参考下思韩大神的极客教程,这里就不赘述了。
需要几台设备并行运行,就需要准备几台主机(any 系统),不同设备连接对应主机,并且在主机上起 Appium 服务(这样就解决 Chromedriver 隔离的问题了)
Jenkins 服务
在任一一台主机部署即可
操作路径:
Manage Jenkins -> Manage Nodes and Clouds
运行几台设备,就需要建几个节点,每个节点对应一台设备
主要是红框标注的地方,第一个是一台设备只能同时运行一个用例,第二个是设备 ID,在运行的时候传给测试脚本
操作路径:
New Item -> 构建一个多配制项目
标注一:选择已经配置好的节点
标注二:配置需要执行的测试用例
Jenkins 会把每个子 JOB 的结果收集起来生成一个完整的报告
都是常规的配置,大家可以参考下
通过 os.getenv 方法获取设备 ID
不同主机的 appium 服务地址与 Chromedriver 路径可以从本地配置中获取
不同用例在不同设备上运行,完美解决运行效率问题
在最初调研方案的时候,有三个可以选择,分别是 airtest、appium、FAT。
FAT 有微信版本限制,直接放弃。
airtest,的确很强大,而且也有多设备并行执行的方案(不知道的可以参考 https://testerhome.com/topics/20326),但是基于图像识别与文本定位并不适合我们的自动化需求,因为我们需要更精准的元素定位。
所以最后直接选择了 appium,当初也不知道多设备运行的坑
额,只能说能力、时间有限,只能从入门到放弃了。当然有实践成功的同学,求分享!! 毕竟技多不压身哈
第一次发帖,有不对和需要改进的地方,欢迎大家指正。
再次感谢 @ 思寒大神的教程,有兴趣大家都去围观一下吧!!