【自动化测试】关于aittest的几篇文章
之前听过 airtest,但一直没有去实践。这里摘录几篇文章,接下来尝试一下。
官网:http://airtest.netease.com/
关于Airtest的使用探索:https://www.jianshu.com/p/32d08455e86f
全面超越Appium,使用Airtest超快速开发App爬虫:https://www.cnblogs.com/xieqiankun/p/use_airtest.html
AitTest 文档介绍:https://airtest.readthedocs.io/zh_CN/latest/README_MORE.html
AnrTest Windows 中文帮助手册:http://airtest.netease.com/docs/cn/1_quick_start/4_get_started_with_Windows_test.html
pywinauto 自动化框架调研:https://my.oschina.net/yangyanxing/blog/167042
一.Airtest简介
Airtest是网易出品的一款基于图像识别和poco控件识别的一款UI自动化测试工具。Airtest的框架是网易团队自己开发的一个图像识别框架,这个框架的祖宗就是一种新颖的图形脚本语言Sikuli。Sikuli这个框架的原理是这样的,计算机用户不需要一行行的去写代码,而是用屏幕截屏的方式,用截出来的图形摆列组合成神器的程序,这是Airtest的一部分。
另外,Airtest也基于poco这个U控件搜索框架,这个框架也是网易自家的跨平台U测试框架,原理类似于appium,通过控件的名称,id之类的来定位目标控件,然后调用函数方法,例如click(),swip()之类的方法来对目标控件进行点击或者是操作。
二、关于自动化测试
aittest的特点:
- 跨平台: Airtest可以在几乎所有平台上执行游戏和App的自动化。
- 一次编写,随处运行: Airtest提供了跨平台的API,囊括了应用安装、模拟输入以及断言等。由于使用图像识别技术来定位UI元素,因此无需嵌入任何代码即可对游戏和应用进行自动化操作。
- 可扩展性: 通过使用Airtest提供的命令行与python API接口,可以很轻松地在大规模设备集群上运行脚本。提供的HTML报告包含了详细操作步骤和截屏,能够迅速定位到失败点。同时,网易也提供了 Airlab 云测试平台服务。
- AirtestIDE: AirtestIDE是一个强大的GUI工具,可以帮助你录制和调试测试脚本。 AirtestIDE提供了完整的自动化工作流程支持:
录制脚本->真机回放->生成报告。
支持平台
- Android
- iOS
- Windows
- Unity
- Cocos2dx
- 白鹭引擎
- 微信小程序
安装
这部分说明了如何在本地python环境中安装Airtest测试框架。如果你需要使用GUI工具,请从 官网直接下载AirtestIDE使用。
系统要求
- 操作系统
- Windows
- MacOS X
- Linux
- Python2.7 & Python3.3+
安装Python Package
使用 pip 来管理安装包和自动安装所有依赖。
pip install -U airtest
我的机器由于安装了Python2和Python3,所以执行时候:
C:\Python37\Scripts>py -3 pip.exe install -U airtest
#安装Win相关依赖
C:\Python37\Scripts>py -3 pip.exe install pywinauto
安装时候,如果遇到报错信息,可以重新执行安装,一般可以安装完成,不行的话,逐个处理依赖问题即可。

你也可以直接从Git仓库安装。
git clone https://github.com/AirtestProject/Airtest.git
pip install -e airtest
因为Airtest还在快速开发中,这里使用 -e 来安装源码。以后你就可以直接使用 git pull 更新代码目录来升级Airtest了。
文档
完整的Airtest框架文档请查阅 readthedocs。
自动化测试,就是把繁杂的人工测试用例利用自动化测试工具编写成代码,让机器代替人工自动跑用例的过程。实际上就是把以人为驱动的测试行为转化为机器执行的一种过程。
意义:节省人力、物力、时间、硬件资源等,提升测试效率,特别对于繁琐重复的测试用例,可以使测试人员更专注于新的测试模块的建立和开发,从而提高测试覆盖率。
三、市面上常见的UI自动化测试工具以及优缺点

以上主流工具的优点跟缺点:

相较于以上工具来说,Airtest有以下优点和缺点:

所以其实基于图像识别的Airtest更适合用于游戏测试多一点。
四、环境的搭建
1.AirtestIDE的下载
AirtestIDE已经帮你集成了所有的环境,自带录制脚本栏,自动生成脚本,自带编辑器还自带模拟器,有了一个AirtestIDE就可以轻松简单的录制脚本了。下载地址是Airtest的官网:
AirtestIDE的使用教程跟文档也在下面的连接中:
http://airtest.netease.com/docs/docs_AirtestIDE-zh_CN/index.html
如果你想要利用Airtest的API,自己拓展更多的高级功能的话,可以先下载airtest的python第三方依赖库:
$brew install python3.6.4
#下载python3
$pip install Airtest
#下载Airtest python第三方依赖库
$pip install poco
#下载Airtest提供的Android app ui测试库pocoui
$brew cask install android-sdk
#安装Android-sdk,详细的配置教程网上有,这里不详细说了。
然后再下载一个Python的编辑器来编辑代码,个人推荐使用的是pycharm。接下来就是使用官方提供的启动demo代码:
from airtest.core.api import *
# 通过ADB连接本地Android设备
connect_device("Android:///")
#安装待测软件apk,路径信息。
install("path/to/your/apk")
#开始运行app
start_app("com.pingan.certicationApp")
#点击某个图片,Airtest中基于图像识别语法,图片自己提供。
touch(Template("image_of_a_button.png"))
#滑动语音,开头图片跟结尾图片
swipe(Template("slide_start.png"), Template("slide_end.png"))
#添加断言的图片
assert_exists(Template("success.png"))
#点击Android上的返回键
#keyevent("BACK")
#点击Android上的Home键返回
#home()
#uninstall("package_name_of_your_apk")
以上已经添加了每一句作用的注释,小伙伴们可以动手试一下将程序跑起来,当然如果说易操作性还是AirtestIDE比较容易上手一点。
五、AirtestIDE的真实场景运用
以上介绍了那么多的就来讲一下实际操作,以平安的智能双录app为例子,首先我们先来看一下用例步骤:
- 1、点击双录列表待上传页面的重新录制按钮
- 2、进入录制后点击开始录制按钮
- 3、点击录制完成
- 4、点击确认完成
-
5、在弹框中点击“确认”
首先连接设备并进行录制:
image
然后我们用IDE开始录制脚本,先截取每一个按钮的图片,进行touch操作,如图1,左边就会产生每张被截取的控件的样式。
之后机器就会在整个界面中取一张截屏,然后在截屏中寻找我们截取的那个部分,然后再定位到图片的位置,对图片进行点击的操作,从而达到通过图像识别进行测试的自动化,当然基于图像识别的方式比较难进行输入值的操作,比较适合一些重复繁琐的按钮点击事件。意思就是说这种通过截取图像再的方式并不是很适合用来做登录类的需要用户输入数据的东西。

那么问题来了,怎么样才能够让Airtest也精准定位到输入框,从而完成自动输入信息类型的自动化测试呢?其实我们别忘了Airtest还有基于poco这个UI控件搜索框架,所以如果是Android类的app,还是比较适合用poco来定位控件的位置,从而实现自动化,下面有一个智能双录软件新建保单的测试用例:
- 1、点击新建双录按钮进入新建双录页面
- 2、随机输入000开头的14位保单号
- 3、输入投保人姓名
- 4、输入投保人证件类型
- 5、输入投保人证件号
- 6、输入保险产品
- 7、输入被保人幸免
- 8、选择销售渠道、产品类型、缴费频次
- 9、填写缴费期、每期保费、保险期间
- 10、勾选双录材料
如图2所示,只要点击AirtestIDE左上角,Android旁边的录制按钮,然后只要点击右边模拟器的响应的控件,就会帮你自动定位那个控件的位置,然后再选择动作事件,例如:点击chlick(),滑动swipe()之类的操作,如果要输入字符的话,可以通过先选中需要输入内容的输入框,然后再用test(“要输入的内容”)来自动进行输入操作,是不是很简单省事?

除了以上这些,我们还可以往脚本里面加入断言,然后利用Airtest一键生成测试报告,如图3所示,这种报告不仅可以让你快速了解到你测试的哪个步骤出错了,而且同时也便于判定UI有没有展示异常,但是Airtest有一个缺陷,就是只要某张图片识别不出来,整个脚本录制进程就会停止,后面的控件就不会再去识别,报告也只会停留在失败的那一步,生成报告可以点报告按钮或者ctrl+l,报告以网页的形式呈现,如下图:

例子
Airtest提供了简洁而且平台无关的API。这部分介绍了如何使用这些API来编写一个自动化脚本,步骤如下:
- 通过ADB连接一台安卓手机
- 安装应用APK
- 运行应用并截图
- 模拟用户输入(点击、滑动、按键)
- 卸载应用
from airtest.core.api import *
# connect an android phone with adb
init_device("Android")
# or use connect_device api
# connect_device("Android:///")
install("path/to/your/apk")
start_app("package_name_of_your_apk")
touch(Template("image_of_a_button.png"))
swipe(Template("slide_start.png"), Template("slide_end.png"))
assert_exists(Template("success.png"))
keyevent("BACK")
home()
uninstall("package_name_of_your_apk")
更多API和使用方法,请参考完整的 Airtest Python API reference ,或者直接看看 API code
基本使用方法
Airtest希望提供平台无关的API,让你的测试代码可以运行在不同平台的设备和应用上。
- 使用 connect_device 来连接任意Android/iOS设备或者Windows窗口。
- 使用 模拟操作 的API来自动化你的游戏或者App。
- 千万 不要 忘记 声明断言 来验证测试结果。
连接设备
使用 connect_device 来连接任意Android/iOS设备或者Windows窗口。
connect_device("platform://host:port/uuid?param=value¶m2=value2")
- platform: Android/iOS/Windows…
- host: Android平台是adb host,iOS下是iproxy host,其他平台请留空
- port: Android下是adb port,iOS下填写iproxy port,其他平台请留空
- uuid: 目标设备的uuid,例如Android下是序列号,windows下是窗口句柄,iOS是uuid
- param: 设备初始化的配置字段,例如cap_method/ori_method/…
- value: 设备初始化字段的值。
查看 connect_devce 获取更多信息。
连接安卓设备
- 通过usb将手机与电脑相连
- 命令行输入
adb devices命令,确保手机连接状态是device - 在Airtest中连接设备
- 如果你连接了多个设备,或者有远程设备,那么使用参数来指定要连接的设备
# connect an android phone with adb
init_device("Android")
# or use connect_device api with default params
connect_device("android:///")
# connect a remote device using custom params
connect_device("android://adbhost:adbport/1234566?cap_method=javacap&touch_method=adb")
连接windows应用
# connect local windows desktop
connect_device("Windows:///")
# connect local windows application
connect_device("Windows:///?title_re=unity.*")
Airtest使用了 pywinauto 作为操作Windows应用的底层库,更多窗口搜索的参数请看 pywinauto documentation 。
声明断言
Airtest提供了以下断言方法:
- assert_exists
- assert_not_exists
- assert_equal
- assert_not_equal
当断言失败,会抛出 AssertsionError。所有断言都会在html报告中显示。
用命令行运行 .air 脚本
使用AirtestIDE你可以非常轻松地录制一个自动化脚本并保存为 .air 目录结构。Airtest命令行则让你能够脱离IDE,在不同宿主机器和被测设备上运行测试脚本。
你可以在命令行参数中指定连接的被测设备,这样就可以运行在不同的手机平台和宿主机器上。只要你的测试代码本身是平台无关的,你就可以在一个平台上录制脚本,然后在不同平台上运行。
下面的例子介绍了命令行的基本用法。可以配合我们提供的示例 airtest/playground/test_blackjack.air/ 来学习使用:
运行自动化用例
# run automated cases and scenarios on various devices
> airtest run "path to your .air dir" --device Android:///
> airtest run "path to your .air dir" --device Android://adbhost:adbport/serialno
> airtest run "path to your .air dir" --device Windows:///?title_re=Unity.*
> airtest run "path to your .air dir" --device iOS:///
...
# show help
> airtest run -h
usage: airtest run [-h] [--device [DEVICE]] [--log [LOG]]
[--recording [RECORDING]]
script
positional arguments:
script air path
optional arguments:
-h, --help show this help message and exit
--device [DEVICE] connect dev by uri string, e.g. Android:///
--log [LOG] set log dir, default to be script dir
--recording [RECORDING]
record screen when running
生成报告
> airtest report "path to your .air dir"
log.html
> airtest report -h
usage: airtest report [-h] [--outfile OUTFILE] [--static_root STATIC_ROOT]
[--log_root LOG_ROOT] [--record RECORD [RECORD ...]]
[--export EXPORT] [--lang LANG]
script
positional arguments:
script script filepath
optional arguments:
-h, --help show this help message and exit
--outfile OUTFILE output html filepath, default to be log.html
--static_root STATIC_ROOT
static files root dir
--log_root LOG_ROOT log & screen data root dir, logfile should be
log_root/log.txt
--record RECORD [RECORD ...]
custom screen record file path
--export EXPORT export a portable report dir containing all resources
--lang LANG report language
获取脚本信息
# print case info in json if defined, including: author, title, desc
> python -m airtest info "path to your .air dir"
{"author": ..., "title": ..., "desc": ...}
引用其他的 .air 脚本
可以将一些通用的操作写在一个 .air 脚本里,然后在其他脚本中 import 它。Airtest提供了 using 接口,能够将需要引用的脚本加入 sys.path 里,其中包含的图片文件也会被加入 Template的搜索路径中。
from airtest.core.api import using
using("common.air")
from common import common_function
common_function()
总结
Airtest操作比较简单,基本上不涉及到代码,所以非常适合刚入门没什么测试经验的人利用这个工具做UI自动化测试,同时Airetest又提供了开源的API,让资深测试工程师可以基于Airtest的框架上再做高级的定制化扩展功能。
如果说这个软件有存在不足的地方,个人认为就是不支持断点续传,如果测试中出现了错误以后整个测试就停下来并且要手动从头开始,这里可以进行二次开发,第一种让某个错误出现的时候选择自动重新跑脚本,这种场景适用于前面的按钮跟后面的按钮不在同一个页面上,没有点击到前面的按钮,后面的按钮也不会出现,第二种将错误记录,再跑接下来的脚本,这种场景适用于两个按钮都在同一级页面,相互间影响不大可以先触发后面的按钮进行测试。
赠人玫瑰
手留余香
我们曾如此渴望命运的波澜,到最后才发现:人生最曼妙的风景,竟是内心的淡定与从容……我们曾如此期盼外界的认可,到最后才知道:世界是自己的,与他人毫无关系!-杨绛先生
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【关注我】。


浙公网安备 33010602011771号