Airtest自动化测试之iOS

Airtest自动化测试之iOS

引子

其实早在17、18年,因为工作需要,自己也就弄过自动化测试,就是因为公司舍不得钱,公司的测试人员一波一波的换人之后,能力是越来越拉胯。而我所在的部门,主职是移动端的开发,顺带也管着测试这帮人,鉴于测试人员的能力有限,当时也就做过一些自动化的测试平台,比如接口健壮性的测试,应用层面的功能测试等等,当然这些都得是自动化的。也是源于那时的经验和观念,现今所在的公司里,也做了一整套自动化的东西,其中也包括我们部门产出的自动化测试,Android、iOS以及PC上的都有覆盖。

本来做完了这些功能之后,也就是偶尔修修补补,让负责的同事维护着就行。不过近段时间,自己想要做的一些小活儿,又遇到了自动化的需求,又重新搭了一遍环境,还是遇到了一些问题,干脆就记录下来,以备不时之需。而我的这个活儿是在需要在iOS设备上来完成的,就直接在iOS上开整了,后续看情况要不要部署Android、unity等环境。

技术选型

从刚开始接触自动化测试的时候,选择HttpRunner、Locust做接口的测试,Macaca做移动端的测试,时隔将近十年,各种框架是一茬接着一茬,包括Airtest、Appium等,当初所用的Macaca也停止更新,Airtest是网易开发的,并且有图像识别能力,也有IDE可以使用,要方便不少。同时使用Python写脚本,简单好上手,也可以脱离IDE直接使用脚本运行,同时支持Android、iOS、Windows应用,对于游戏包括unity、cocos引擎也有支持,覆盖很全,所以成了我的首选方案。

我也调研过facebook新出的的 idb - iOS Development Bridge ,折腾了半天,似乎它只支持iOS的模拟器,我在真机上测试的时候,比如滑动屏幕就会报错,可以参考这个issue

Airtest

Airtest官网

安装ide

官网上直接下载安装包安装即可。

iOS环境搭建

官方文档 - iOS设备连接
Airtest官网上的文档有介绍如何连接iOS设备(真机),选择他们首推的iOS-Tagent方式。

为什么不实用appium的wda:

  1. 值得注意的是,airtest1.2.5及以上版本,或者是AirtestIDE1.2.14及以上版本,我们不仅兼容了高版本的iOS系统和xcode,而且优化了iOS设备的点击和滑动速度,所以我们非常建议同学们使用我们的 ios-tagent 来对你的真机进行调试。
  2. 在真机上部署appium的wda,然后使用1.2.8及以上版本的AirtestIDE连接该iOS设备,并不会影响Airtest和Poco相应功能的使用,与iOS-Tagent项目一致;但可能存在iOS卡顿较严重的情况,暂无优化方案。我就遇到了这个问题。

安装iOS-Tagent

参阅 文档

按照步骤将 iOS-Tagent 安装到手机并运行。

可能遇到的问题:

  1. 记得修改bundleid
  2. 记得到手机里设置信任证书,否则xcode会提示不能运行应用

手机上会安装一个 WebDriverAgent 的应用,并且测试期间需要保证此应用开启,开启时屏幕上会显示水印(Automation Running)。

设置代理

iproxy 可以把iPhone端口映射到电脑端口,那么就可以通过访问电脑的端口访问到手机的端口了。

一般情况下,需要通过设置usb代理的方式访问手机上的Agent,直接通过wifi对手机进行访问可能会出现问题,具体的原因可以参考 Issues 和 detail

  • 通过 Homebrew 安装iproxy

    $ brew install libimobiledevice

  • 运行iproxy

    $ iproxy 8100 8100

启动成功后,可以试着在浏览器访问 http://127.0.0.1:8100/status ,如果访问成功并且可以看到一些json格式的手机信息,即表示启动成功(我能看到这个)。此时,访问 http://127.0.0.1:8100/inspector 可以看到iPhone屏幕投影在浏览器上(我看不到这个画面,而且还有报错,但是Airtest中能连上画面)。

连接画面

完成上面两个步骤后,就可以在AirtestIDE的iOS地址栏填入地址 http://127.0.0.1:8100 ,点击 “connect” 连接设备,开始编写你的Airtest测试脚本了。

图片转载自Airtest文档

连接后的效果:

写个脚本试试

创建一个脚本文件,并输入以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
# -*- encoding=utf8 -*-
__author__ = "test"

from airtest.core.api import *

auto_setup(__file__)

connect_device("iOS:///http://127.0.0.1:8100")

from poco.drivers.ios import iosPoco
poco = iosPoco()
poco("Window").offspring("Home screen icons").child("Other").offspring("抖音").click()

这是使用 相对选择器 定位抖音,并打开抖音的代码。

总结

基本的环境搭建和简单的代码操作也就完成了,之后就是编写代码实现各种不同的测试需求了,这里就不再赘述,多看看Airtest的文档。