微信小程序自动化多设备分布式运行方案

前言

  • 自动化框架:Appium + Pytest + Allure
  • 测试用例调度:Jenkins

背景

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

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服务

在任一一台主机部署即可

  • Jenkins节点配置

操作路径:

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

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

  • Jenkins 矩阵JOB

操作路径:

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

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

  • Jenkins构建与报告

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

  • 测试用例调整

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

  • 执行成果预览

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

Q&A

  • 自动化方案选择,为什么是appium

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

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

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

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

  • appium docker理论上可以完美解决多设备运行问题,为啥放弃了

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

最后

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