【移动APP测试】跨平台自动化工具Airtest详细使用指导详细介绍(有关必回)
Airtest是一款由网易推出的跨平台UI自动化测试框架,支持Android、iOS、Windows等平台,适用于App、Web和小程序测试。其核心优势包括图像识别技术、零代码录制功能、双引擎驱动(Airtest+Poco)以及可视化测试报告。通过AirtestIDE可快速录制测试脚本,支持图像和控件两种定位方式,并提供丰富的API进行断言和操作。测试完成后能生成详细的HTML报告,方便问题定位。
Airtest详细使用指导:跨平台UI自动化测试利器
一、 Airtest 简介与核心优势
1.1 什么是Airtest?
Airtest是由网易游戏推出的一款基于图像识别和UI控件识别的跨平台UI自动化测试框架。它最初旨在解决游戏自动化测试的难题,但现在已广泛应用于App、Web和小程序的测试。
1.2 核心组成
-
Airtest IDE: 一个强大的图形化工具,集成了脚本录制、编辑、运行和报告生成功能。
-
Airtest Library: 核心Python库,提供基于图像识别的API(如
touch
,swipe
,assert_exists
)。 -
Poco Library: 另一个核心库,提供基于UI控件查找的API(类似于Appium和XCUITest),需要应用接入Poco-SDK才能发挥最大效力。
-
Airtest Report: 美观详尽的HTML测试报告,包含每一步的操作截图和日志。
1.3 核心优势
-
跨平台: 支持Android、iOS、Windows应用和游戏,甚至Unity、Cocos2dx、Egret等游戏引擎。
-
零代码/低代码: 通过IDE录制功能,无需编写代码即可生成测试脚本,对测试人员极其友好。
-
图像识别: 不依赖应用内部结构,通过截图即可进行操作和断言,尤其适合游戏、H5等无法轻易获取控件树的应用。
-
双引擎驱动: 图像识别 (Airtest) + 控件识别 (Poco),可根据测试对象灵活选择或组合使用。
-
强大的报告: 可视化报告非常直观,便于快速定位失败原因。
二、 环境搭建与IDE使用
2.1 安装Airtest IDE
这是最快上手的方式。
-
访问Airtest官网(
airtest.netease.com
)下载对应操作系统的Airtest IDE。 -
解压后直接运行可执行文件,无需安装。
2.2 连接设备
-
Android手机:
-
开启手机的USB调试模式。
-
通过USB线连接电脑。
-
在Airtest IDE中,点击顶部的 refresh ADB 按钮,设备通常会自动出现。
-
-
iOS手机:
-
需要安装
tidevice
库:pip install -U tidevice
-
使用WebDriverAgent(WDA),Airtest IDE提供了“一键安装WDA”的功能,但过程相对复杂。
-
-
Windows应用: 直接选择“Windows Window”并选中你要测试的应用窗口。
2.3 IDE界面熟悉
-
设备窗格: 显示已连接的设备并进行管理。
-
脚本窗格: 编写和显示Airtest/Poco脚本。
-
报告窗格: 显示运行日志和最终报告。
-
辅助窗格: 包含Poco Inspector(查看UI控件结构)、录制工具、图像编辑器等。
三、 核心API与脚本编写
Airtest脚本本质上是Python脚本,它引入了airtest.core.api
中的各种方法。
3.1 基于图像识别的API(Airtest Core)
这是Airtest的特色,不关心控件结构,只关心屏幕上的图像。
python
# -*- encoding=utf8 -*- __author__ = "YourName" from airtest.core.api import * # 导入所有核心API # 1. 连接设备(通常在IDE中自动完成) # auto_setup(__file__) # 初始化脚本,IDE会自动添加 # 2. 常用操作 touch(Template("login_button.png")) # 点击图像"login_button.png"所在位置 sleep(1.0) # 强制等待,慎用,尽量用wait swipe(Template("start_point.png"), Template("end_point.png"), duration=0.5) # 滑动 text("123456") # 输入文本,在当前焦点输入框输入 keyevent("ENTER") # 模拟物理按键,如HOME, BACK, ENTER wait(Template("success_icon.png"), timeout=20) # 等待某个图片出现,最多等20秒 # 3. 常用断言 assert_exists(Template("welcome_page.png"), "验证登录成功,进入欢迎页") # 断言图片存在 assert_not_exists(Template("error_popup.png"), "验证错误弹窗没有出现") # 断言图片不存在 # 4. 其他实用API snapshot("login_success.jpg") # 手动截图并保存在报告中 exists(Template("some_image.png")) # 判断图片是否存在,返回坐标或False
如何获取图像? 使用IDE的截图功能(ctrl+shift+A
),拖动鼠标框选区域,图像会自动保存到脚本同级目录并插入代码。
3.2 基于控件识别的API(Poco)
这种方式更精确稳定,但需要应用可被Poco识别。
-
对于原生App/游戏: 需要接入Poco-SDK(如
poco-u3d
,poco-cocos2dx
等)。 -
对于Android/iOS原生App: 可以使用Airtest IDE自带的Poco模式(选择对应模式如
Android
或iOS
)来查看控件树,通常无需额外接入。
python
from poco.drivers.android.uiautomation import AndroidUiautomationPoco poco = AndroidUiautomationPoco() # 初始化Poco对象(IDE通常会自动生成) # 定位控件并操作 poco("com.netease.demo:id/username").set_text("testuser") poco("com.netease.demo:id/password").set_text("password123") poco("com.netease.demo:id/login_btn").click() # 常用Poco选择器 poco(type="Button", text="登录") # 通过属性组合定位 poco("login_btn").offspring("container").child("title") # 通过层级关系定位 # 常用Poco操作 poco("btn").click() # 点击 poco("list_view").swipe(
"up") # 在控件内滑动 if poco("status_text").exists(): # 判断控件是否存在 print(poco("status_text").get_text()) # 获取控件文本 # Poco断言 assert_equal(poco("score_text").get_text(), "100", "验证得分是否正确")
四、 实战:录制与编写一个完整的测试用例
我们以测试一个登录功能为例。
-
录制脚本(快速入门)
-
在Airtest IDE中连接好设备。
-
点击脚本窗格上的 录制 按钮。
-
在设备窗格中操作你的应用:点击用户名输入框、输入文本、点击密码框、输入密码、点击登录按钮。
-
操作完成后,再次点击录制按钮停止。IDE会自动生成一系列
touch
和text
语句。
-
-
优化脚本(添加等待和断言)
录制的脚本很脆弱,需要添加同步和验证逻辑。python
from airtest.core.api import * # 等待登录界面加载完成 wait(Template("login_page_title.png"), timeout=10) # 录制生成的步骤 touch(Template("username_field.png")) text("testuser") touch(Template("password_field.png")) text("password123") touch(Template("login_button.png")) # 添加断言:验证登录成功,例如等待跳转后的某个特征元素出现 success = wait(Template("welcome_tab.png"), timeout=15) assert success, "登录失败,未成功跳转到欢迎页" # 或者使用Poco断言(如果可用) # assert poco("welcome_tab").exists()
-
参数化与循环
可以使用正常的Python语法来使脚本更强大。python
# 参数化测试数据 test_data = [ {"user": "admin", "passwd": "123", "expected": "success"}, {"user": "test", "passwd": "wrong", "expected": "fail"} ] for data in test_data: poco("username").set_text(data["user"]) poco("password").set_text(data["passwd"]) poco("login_btn").click() if data["expected"] == "success": assert_exists(Template("welcome.png")) else: assert_exists(Template("error_toast.png")) back() # 返回登录页进行下一次循环
五、 运行测试与生成报告
5.1 在IDE中运行
-
点击IDE顶部的 运行 按钮即可运行当前脚本。
-
运行过程中,设备窗格会实时显示操作过程,报告窗格会显示日志。
5.2 通过命令行运行(CI集成)
这是集成到持续集成的关键。
bash
# 基本命令 airtest run "D:/test/login.air" --device Android:///手机设备号 --log "D:/test/logs/" # 生成HTML报告 airtest report "D:/test/login.air" --log_root "D:/test/logs/" --outfile "D:/test/logs/report.html" --lang zh
-
run
命令用于执行脚本。 -
report
命令用于将运行的日志转换成漂亮的HTML报告。
5.3 查看报告
生成的HTML报告是一个独立的文件,可以直接在浏览器中打开。报告中清晰展示了:
-
每个步骤的截图和操作结果(成功/失败)。
-
失败步骤的详细错误信息。
-
脚本运行的整体时间和结果。
六、 最佳实践与常见问题
6.1 最佳实践
-
图像识别技巧:
-
截图时选择特征明显、背景稳定的区域。
-
适当使用IDE提供的
crop
(裁剪)和rgb
(色值过滤)功能提高识别率。
-
-
脚本稳定性:
-
多用
wait
,少用sleep
。 -
对关键步骤添加断言,而不是盲目执行下一步。
-
考虑使用try-except和重试机制处理偶发性问题。
-
-
编写可维护脚本:
-
将公共操作(如登录)封装成函数。
-
使用配置文件(如YAML)管理设备信息、测试数据。
-
利用Python的面向对象特性组织测试用例。
-
6.2 常见问题
-
图像识别失败?
-
原因:分辨率变化、UI改版、动态元素、遮挡。
-
解决:更新截图;调整识别阈值(
threshold
);选择更独特的识别区域。
-
-
如何滑动的更准确?
-
使用
swipe
的duration
参数控制滑动速度。对于长列表,在Poco中使用swipe("up")
或swipe("down")
更可靠。
-
-
如何在代码中判断是Android还是iOS?
python
from airtest.core.api import connect_device dev = connect_device("Android:///") # 获取当前设备 if dev.platform == "Android": # do something else: # do something else
七、 总结
Airtest通过其“图像识别为主,控件识别为辅”的创新理念,极大地降低了UI自动化测试的门槛,特别是在游戏和复杂应用领域表现突出。它的图形化IDE让初学者也能快速上手,而其强大的Python API又能满足高级测试开发者的定制化需求。
无论是进行简单的冒烟测试,还是构建复杂的自动化测试流程,Airtest都是一个非常值得学习和使用的强大工具。建议从Airtest IDE的录制功能开始体验,逐步过渡到编写稳定、可维护的脚本,最终将其集成到您的CI/CD管道中。
更多推荐
所有评论(0)