Airtest详细使用指导:跨平台UI自动化测试利器

一、 Airtest 简介与核心优势

1.1 什么是Airtest?
Airtest是由网易游戏推出的一款基于图像识别和UI控件识别的跨平台UI自动化测试框架。它最初旨在解决游戏自动化测试的难题,但现在已广泛应用于App、Web和小程序的测试。

1.2 核心组成

  • Airtest IDE: 一个强大的图形化工具,集成了脚本录制、编辑、运行和报告生成功能。

  • Airtest Library: 核心Python库,提供基于图像识别的API(如touchswipeassert_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
这是最快上手的方式。

  1. 访问Airtest官网(airtest.netease.com)下载对应操作系统的Airtest IDE。

  2. 解压后直接运行可执行文件,无需安装。

2.2 连接设备

  • Android手机:

    1. 开启手机的USB调试模式。

    2. 通过USB线连接电脑。

    3. 在Airtest IDE中,点击顶部的 refresh ADB 按钮,设备通常会自动出现。

  • iOS手机:

    1. 需要安装tidevice库:pip install -U tidevice

    2. 使用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-u3dpoco-cocos2dx等)。

  • 对于Android/iOS原生App: 可以使用Airtest IDE自带的Poco模式(选择对应模式如AndroidiOS)来查看控件树,通常无需额外接入。

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", "验证得分是否正确")

四、 实战:录制与编写一个完整的测试用例

我们以测试一个登录功能为例。

  1. 录制脚本(快速入门)

    • 在Airtest IDE中连接好设备。

    • 点击脚本窗格上的 录制 按钮。

    • 在设备窗格中操作你的应用:点击用户名输入框、输入文本、点击密码框、输入密码、点击登录按钮。

    • 操作完成后,再次点击录制按钮停止。IDE会自动生成一系列touchtext语句。

  2. 优化脚本(添加等待和断言)
    录制的脚本很脆弱,需要添加同步和验证逻辑。

    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()
  3. 参数化与循环
    可以使用正常的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 最佳实践

  1. 图像识别技巧:

    • 截图时选择特征明显、背景稳定的区域。

    • 适当使用IDE提供的crop(裁剪)和rgb(色值过滤)功能提高识别率。

  2. 脚本稳定性:

    • 多用wait,少用sleep

    • 对关键步骤添加断言,而不是盲目执行下一步。

    • 考虑使用try-except和重试机制处理偶发性问题。

  3. 编写可维护脚本:

    • 将公共操作(如登录)封装成函数

    • 使用配置文件(如YAML)管理设备信息、测试数据。

    • 利用Python的面向对象特性组织测试用例。

6.2 常见问题

  • 图像识别失败?

    • 原因:分辨率变化、UI改版、动态元素、遮挡。

    • 解决:更新截图;调整识别阈值(threshold);选择更独特的识别区域。

  • 如何滑动的更准确?

    • 使用swipeduration参数控制滑动速度。对于长列表,在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管道中。

Logo

纵情码海钱塘涌,杭州开发者创新动! 属于杭州的开发者社区!致力于为杭州地区的开发者提供学习、合作和成长的机会;同时也为企业交流招聘提供舞台!

更多推荐