ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Airtest UI自动化测试实战:从图像识别到控件操作,覆盖游戏与多平台应用

Airtest UI自动化测试实战:从图像识别到控件操作,覆盖游戏与多平台应用 1. 项目概述为什么选择Airtest做UI自动化测试如果你是一名测试工程师或者是一名想把手动重复操作变成自动化脚本的开发者最近肯定被“UI自动化测试”这个词刷屏了。市面上工具不少从老牌的Selenium、Appium到新兴的Playwright、Cypress选择多得让人眼花缭乱。但当你面对一个横跨Android、iOS、Windows桌面端甚至还有游戏尤其是Unity、Cocos引擎的测试需求时你会发现很多工具要么平台支持不全要么对游戏这类非标准UI束手无策。这就是Airtest项目切入的精准场景。我第一次接触Airtest是在一个手游项目的测试中当时我们需要对一款Unity引擎开发的游戏进行功能回归测试。传统的基于控件树的UI自动化框架比如Appium在这里完全失效因为游戏画面是GPU直接渲染的没有标准的UI控件树。而基于坐标点击的方式又脆弱不堪屏幕分辨率一变就全完了。Airtest提供的“基于图像识别的自动化”方案像是一把万能钥匙完美地解决了这个痛点。它不关心你的界面是怎么画出来的只关心屏幕上“看起来”是什么样子通过截图对比来定位和操作元素这种思路让它在游戏和某些传统UI框架难以处理的App测试中表现出了惊人的适应性。当然Airtest并不止于此。它还有一个孪生兄弟叫Poco专门解决“有标准UI控件树”的场景比如原生Android/iOS App、小程序等。AirtestPoco的组合实际上覆盖了从“图像”到“控件”的两种主流UI自动化测试范式。更吸引人的是它提供了一个名为AirtestIDE的集成开发环境把设备连接、脚本录制、编写、运行和报告查看都集成在了一起对新手极其友好号称“5分钟上手”并非虚言。所以这篇内容就是为你准备的无论你是想快速入门UI自动化测试的新手还是正在为多平台、特别是游戏类应用的自动化测试方案选型而头疼的资深测试都能在这里找到一条清晰的实践路径。我会结合我过去在多个真实项目中的使用经验带你从零开始不仅学会如何使用AirtestIDE这个工具更会深入理解其背后的原理分享那些官方文档里不会写的“踩坑”经验和性能优化技巧让你能真正把Airtest用起来用好它。2. 核心架构与工具选型解析在动手写第一行脚本之前我们必须先理解Airtest项目的“一体两面”。很多初学者会混淆Airtest和Poco其实它们是两个独立但协同工作的框架共同构成了Airtest Project的核心。2.1 Airtest框架基于图像识别的“火眼金睛”Airtest的核心能力是基于图像识别的UI自动化。你可以把它想象成一个不知疲倦的、拥有完美记忆力的“找茬”机器人。它的工作原理是这样的你在脚本中插入一张你期望在屏幕上看到的图片比如一个按钮的截图Airtest运行时会在当前设备屏幕上不断地进行搜索和匹配。它使用了一种叫做模板匹配的算法结合一些特征点检测技术来寻找与你的目标图片最相似的区域。一旦找到它就会计算出这个区域在屏幕上的坐标然后执行你预设的操作比如点击、滑动。为什么需要这个主要应对两类场景游戏界面如前所述游戏UI是图形渲染的没有控件树信息。难以定位的控件某些App或桌面程序的控件无法通过常规属性如id、text准确定位或者控件树结构异常复杂。它的优势与局限优势跨平台能力强理论上任何能截图的东西都能测、对应用内部实现零侵入、学习成本低截个图就行。局限执行效率相对较低因为要进行图像处理、受屏幕分辨率、缩放、颜色、动态内容如动画影响较大脚本的稳定性健壮性需要精心设计。实操心得不要过度依赖Airtest的图像识别做所有事情。对于位置固定、样式稳定的图标、按钮它很好用。但对于文本输入、列表滑动等操作有更好的替代方案。2.2 Poco框架基于UI控件树的“结构大师”Poco则是另一个思路它通过访问应用的UI控件树来进行元素定位和操作这和我们熟知的Selenium、Appium非常像。它需要与被测应用建立通信。对于原生Android/iOS AppPoco通过访问系统提供的UI自动化接口如Android的UIAutomator iOS的XCUITest来获取控件树无需对App做任何修改。对于游戏Unity、Cocos2dx等则需要在游戏工程中接入一个轻量级的Poco-SDK以便在运行时将游戏内的UI节点信息暴露出来。为什么需要Poco因为当你能直接访问控件树时自动化脚本会变得更强大、更稳定、更高效。精准定位可以通过ID、名称、类型等多种属性组合定位不惧UI位置变化。获取属性可以读取控件的文本、坐标、尺寸、是否可点击等状态。高效操作直接调用控件的方法比通过图像计算坐标再点击要快得多。Airtest和Poco的关系不是二选一而是相辅相成。在实际项目中我经常混合使用。例如用Airtest的图像识别来启动游戏、处理一些全屏弹窗进入主界面后则切换到Poco模式利用控件树进行精细化的操作和断言。AirtestIDE完美地将两者集成在了一起可以无缝切换。2.3 AirtestIDE一站式的自动化工作台这是对新手最友好的部分。AirtestIDE是一个图形化桌面应用它把设备连接、脚本编辑器、实时画面、对象查看器Poco Inspector、脚本录制、运行和报告生成全部整合在了一个界面里。它的核心价值在于所见即所得的脚本录制你一边在设备窗口里操作它一边帮你生成代码。这是最快的入门方式。实时UI树查看连接设备后可以立刻看到当前界面的控件层级结构方便编写Poco脚本。图像脚本辅助框选屏幕区域自动生成touch(图片)这样的语句。内置Python环境与代码补全开箱即用无需自己配置复杂的Python环境。对于快速验证想法、编写原型脚本、执行日常的简单自动化任务AirtestIDE几乎是最佳选择。但到了项目后期需要集成到CI/CD持续集成/持续部署流水线中时我们就需要脱离IDE使用命令行来运行脚本这也是Airtest设计时就支持的特性。3. 环境搭建与设备连接实战理论清楚了我们立刻动手搭建环境。整个过程我会以Windows平台测试Android手机为例这是最常见的场景。其他平台Mac、iOS、Windows应用的思路大同小异。3.1 安装AirtestIDE这一步最简单。前往AirtestProject的GitHub仓库或官网下载对应操作系统Windows/macOS的AirtestIDE安装包。Windows版是一个.exe文件直接安装即可。Linux版本官方只维护到较旧的1.2.3所以不建议在Linux桌面环境使用IDE但可以通过pip安装airtest库在命令行运行。安装完成后打开你会看到一个清爽的界面主要分为设备连接窗口、脚本编辑区、辅助工具面板和日志输出区。3.2 连接Android设备真机这是第一个小挑战。Airtest通过ADBAndroid Debug Bridge与Android设备通信。步骤详解准备手机在手机的“设置”-“关于手机”中连续点击“版本号”7次开启“开发者选项”。然后进入“开发者选项”开启“USB调试”。部分手机还需要开启“USB调试安全设置”允许通过USB安装应用。连接电脑使用USB数据线连接手机和电脑。手机会弹出“是否允许USB调试”的授权框务必勾选“始终允许”并点击确定。IDE内连接在AirtestIDE右侧的“设备连接”面板点击刷新ADB按钮。如果一切正常你应该能在设备列表中看到你的手机型号。点击设备右侧的Connect按钮。首次连接时IDE可能会自动在手机上安装一个叫Yosemite的辅助APK用于Poco对原生App的控件识别和一个Airtest输入法用于模拟文本输入。连接成功后中间的主窗口会实时显示手机屏幕。常见问题与排查设备列表为空首先检查adb devices命令在电脑终端里是否能列出设备。如果不能说明ADB驱动或连接有问题。可以尝试更换USB线或USB口。在手机开发者选项里关闭再重新打开USB调试。重启电脑上的ADB服务在IDE设备面板点击重启ADB。安装手机厂商官方的USB驱动。连接后黑屏或卡住可能是手机屏幕锁屏导致的。保持手机亮屏并解锁。部分手机如华为可能需要额外开启“禁止权限监控”等选项。反复弹出安装提示如果Yosemite APK安装失败可以尝试手动下载apk使用adb install命令安装。注意事项确保电脑上只运行了一个ADB服务。如果你之前开过Android Studio或其他手机助手可能会造成ADB端口冲突。关闭它们或者使用AirtestIDE的重启ADB功能通常能解决。3.3 连接Windows应用窗口测试PC上的桌面程序如一个客户端游戏或软件也非常方便。在AirtestIDE设备面板点击游戏画面按钮。鼠标会变成一个十字准星将其移动到你想测试的应用程序窗口上该窗口会被红色边框高亮。点击鼠标左键该窗口就会被嵌入到AirtestIDE中。你也可以点击搜索窗口按钮通过输入窗口标题来查找并连接。连接成功后你就可以像操作手机屏幕一样对这个Windows应用窗口进行图像识别和操作了。Airtest会把这个窗口当作一个“屏幕”来处理。3.4 初步了解脚本结构连接设备后我们先不急着录制看看一个最简单的Airtest脚本是什么样子。在脚本编辑区你可以直接输入Python代码。# 这是一个简单的Airtest脚本示例 from airtest.core.api import * # 引入Airtest核心API # 连接设备如果通过IDE运行通常会自动使用当前连接的设备 # auto_setup(__file__) # 1. 基于图像的操作 touch(Template(rtpl_start_button.png)) # 点击一张名为 start_button.png 的图片 sleep(1.0) # 等待1秒 swipe(Template(rtpl_swipe_start.png), Template(rtpl_swipe_end.png)) # 从图片A滑动到图片B # 2. 基于Poco的操作假设已初始化Poco from poco.drivers.android.uiautomation import AndroidUiautomationPoco poco AndroidUiautomationPoco() poco(com.example.app:id/login_button).click() # 通过ID点击控件可以看到脚本混合了图像操作(touch,swipe)和控件操作(poco.click)。Template对象用于加载图片断言。auto_setup是一个方便的初始化函数但我们在IDE中运行时通常不需要手动调用。4. 脚本录制与编写从入门到精通现在进入最核心的环节编写自动化脚本。我们将从最傻瓜式的录制开始逐步深入到手动编写稳定、高效的脚本。4.1 使用AirtestIDE录制图像脚本对于图像识别脚本录制是最快的方式。确保设备已连接并画面显示在IDE中。点击Airtest辅助窗左侧上的录制按钮或者按F5键开始录制。在设备窗口中进行你的操作点击、滑动、输入文字等。观察脚本编辑区IDE会根据你的操作自动生成对应的代码行。操作结束后再次点击录制按钮或按F5停止。录制生成的代码分析假设你点击了屏幕上的一个“开始游戏”按钮IDE可能会生成touch(Template(rtpl_xxx.png, record_pos(0.001, -0.002), resolution(1080, 2340)))这行代码的意思是在当前屏幕分辨率(1080,2340)下点击一个位于屏幕相对位置(0.001, -0.002)附近的、与图片tpl_xxx.png匹配的区域。record_pos是录制时根据屏幕分辨率计算出的归一化坐标范围-0.5到0.5用于加速图像搜索。resolution是录制时的屏幕分辨率用于在不同分辨率设备上做坐标转换。实操心得自动录制的图片脚本在同一台设备、相同屏幕状态下运行良好但换设备或UI稍有变化就容易失败。因此录制只是一个起点我们需要优化它。4.2 优化图像脚本提升稳定性图像脚本的稳定性是最大的挑战。以下是几个关键优化技巧使用更独特的截图截取按钮时尽量包含其周围一点独特的背景避免截取大面积的、容易变化的纯色区域或重复图案。调整识别阈值Template对象有一个threshold参数默认是0.8置信度。如果UI有轻微变色或抗锯齿可以适当降低比如0.7。touch(Template(r“button.png” threshold0.7))使用wait和exists进行等待和断言不要直接touch先等待元素出现。start_btn Template(r“start_button.png”) if exists(start_btn): # 等待并判断元素是否存在 touch(start_btn) else: log(“开始按钮未找到”)wait函数可以设置超时时间更常用wait(start_btn timeout10) # 最多等待10秒 touch(start_btn)处理动态内容对于有动画的UI可以在动画结束后再截图或操作加sleep。使用Snapshot功能截取多张图或者截取动画中相对稳定的一帧。关闭Template的rgb参数只使用灰度图进行匹配rgbFalse对颜色变化不敏感。4.3 使用Poco编写控件脚本当测试原生App或已接入Poco-SDK的游戏时控件脚本是更优的选择。首先我们需要在Poco辅助窗中初始化对应的模式。切换Poco模式在IDE左侧从Airtest辅助窗切换到Poco辅助窗。选择模式下拉菜单中选择对应的模式。对于Android原生App选择Android。对于Unity游戏选择Unity。刷新UI树点击刷新按钮当前界面的UI控件树就会以层级结构展示出来。编写Poco脚本在UI树中你可以点击任何一个控件Poco辅助窗会显示它的所有属性name, type, pos, size等。双击某个控件节点IDE会自动生成定位该控件的代码到编辑区。例如双击一个名为btn_start的按钮会生成poco(“btn_start”).click()更强大的定位器Poco支持多种定位方式这是其强大之处。通过属性poco(text“登录”)通过类型poco(type“android.widget.Button”)通过组合条件poco(type“Button” textMatches“^开始.*$”)(使用正则匹配)通过层级关系# 先定位父容器再找子按钮 parent poco(“com.example.app:id/parent_layout”) parent.child(“android.widget.Button”)[0].click()Poco的核心APIclick(): 点击set_text(): 输入文本swipe(): 滑动attr(‘name’): 获取属性如get_text(),get_name(),get_position()wait_for_appearance(): 等待控件出现wait_for_disappearance(): 等待控件消失4.4 混合使用Airtest与Poco一个经典的混合使用场景是用Airtest启动App并处理启动广告图像识别然后用Poco进行核心业务流程测试控件操作。from airtest.core.api import * from poco.drivers.android.uiautomation import AndroidUiautomationPoco # 初始化Poco poco AndroidUiautomationPoco() # 1. 使用Airtest图像识别关闭可能出现的弹窗广告 if exists(Template(r“tpl_close_ad.png”)): touch(Template(r“tpl_close_ad.png”)) # 2. 使用Poco进行登录操作 poco(“com.app:id/username”).set_text(“testuser”) poco(“com.app:id/password”).set_text(“password123”) poco(“com.app:id/login_btn”).click() # 3. 等待登录成功可能又是一个图像断言 wait(Template(r“tpl_homepage_logo.png”) timeout15) # 4. 继续用Poco操作主界面 poco(“首页”).click() # 假设控件text是“首页”这种混合模式结合了二者的优点既能应对无控件树的场景又能享受控件操作的高效和稳定。5. 断言、报告与脚本组织自动化测试不只是“动起来”还要能“判断对错”并“说出结果”。5.1 断言验证测试结果断言是测试脚本的灵魂用于验证操作后是否符合预期。Airtest图像断言assert_exists(Template(...)): 断言图片存在。assert_not_exists(Template(...)): 断言图片不存在。# 点击后断言成功提示出现 touch(commit_btn) assert_exists(Template(r“tpl_success_toast.png”))Poco控件断言通常结合Python自带的assert语句和Poco的属性获取功能。# 登录后断言用户名显示正确 login(“testuser” “password”) username_display poco(“user_name”).get_text() assert username_display “testuser” f“用户名显示错误期望‘testuser’实际‘{username_display}’” # 断言按钮不可点击 assert poco(“submit_btn”).attr(‘enabled’) False “提交按钮应不可用”通用值断言Airtest也提供assert_equal和assert_not_equal。score poco(“score_text”).get_text() assert_equal(int(score) 100 “得分应为100”)5.2 生成与查看测试报告AirtestIDE在运行脚本后会自动生成一份非常直观的HTML测试报告。生成报告脚本运行结束后点击IDE工具栏上的查看报告按钮或按CtrlL。报告内容报告会以时间线形式展示每个测试步骤。步骤详情包括执行的命令、目标图片可点击放大、使用的定位器。执行结果成功绿色对勾或失败红色叉号。屏幕截图每个关键步骤都会自动截图失败步骤的截图对排查问题至关重要。日志输出脚本中log()函数打印的信息也会显示在报告中。自定义报告你可以在脚本中使用log()添加自定义信息丰富报告内容。也可以使用snapshot()手动插入截图。注意事项默认的报告查看器可能在某些浏览器上有兼容性问题。如果遇到显示异常建议用Chrome浏览器打开生成的HTML文件。报告文件默认保存在临时目录记得将其复制到安全位置进行归档。5.3 脚本组织与模块化当测试用例越来越多时良好的脚本组织是维护性的关键。使用.air脚本文件夹AirtestIDE创建的脚本默认是.air格式这其实是一个文件夹里面包含.py主脚本、png图片资源等。将相关功能的脚本和图片放在同一个.air文件夹内方便管理。模块化与函数封装将通用的操作封装成函数或类。# common.air/common.py def login(username password): poco(“username_input”).set_text(username) poco(“password_input”).set_text(password) poco(“login_button”).click() wait(Template(r“tpl_home.png”)) # test_suite.air/test_main.py from common import login login(“admin” “123456”) # ... 后续测试使用配置文件将设备信息、账号密码、URL等配置信息提取到单独的config.yaml或config.ini文件中避免硬编码。目录结构示例MyTestProject/ ├── config.ini ├── common/ │ ├── __init__.py │ └── page_actions.py (封装页面操作) ├── test_cases/ │ ├── test_login.air/ │ │ ├── test_login.py │ │ └── tpl_login_success.png │ └── test_payment.air/ │ ├── test_payment.py │ └── tpl_payment_confirm.png └── run_all.py (批量运行入口)6. 进阶命令行运行与持续集成AirtestIDE适合开发和调试但真正的自动化测试需要集成到无人值守的流程中这就需要使用命令行。6.1 使用命令行运行Airtest脚本Airtest脚本本质上是一个Python脚本可以通过airtest命令行工具运行。安装Airtest核心库如果你只在IDE里写脚本可以跳过。但要在服务器或无GUI环境运行需要安装pip install airtest如果你要用Poco还需要安装对应的驱动例如Androidpip install pocoui基本运行命令airtest run test_case.air --device Android:///手机设备号 --log log/run: 运行指令。test_case.air: 你的脚本路径.air文件夹或.py文件。--device: 指定运行设备。格式为平台://连接参数。例如Android://127.0.0.1:5037/手机序列号Windows:///?title窗口标题iOS:///手机UDID(需要连接Mac)--log: 指定日志和报告输出目录。生成报告运行完成后使用以下命令生成HTML报告airtest report test_case.air --log_root log/ --outfile log/report.html6.2 集成到持续集成CI流程将Airtest测试集成到Jenkins、GitLab CI等工具中可以实现代码提交后自动触发测试。核心思路在CI服务器上安装Python环境、Airtest库、以及必要的设备驱动如ADB。如果是真机测试需要将设备通过USB连接到CI服务器并确保ADB连接稳定。更推荐使用云测平台或设备农场如AirtestProject官方提供的私有云方案、或各大云厂商的设备服务。在CI的Pipeline配置中添加执行Airtest命令行和生成报告的步骤。将生成的HTML报告作为构建产物发布或集成到Allure等更专业的测试报告系统中。一个简化的Jenkins Pipeline示例pipeline { agent any stages { stage(‘Checkout’) { steps { git ‘https://your-git-repo.git‘ } } stage(‘Install Dependencies’) { steps { sh ‘pip install airtest pocoui’ } } stage(‘Run Airtest’) { steps { // 假设设备已连接这里运行测试套件 sh ‘airtest run test_suite.air --device Android:/// --log ./results’ } } stage(‘Generate Report’) { steps { sh ‘airtest report test_suite.air --log_root ./results --outfile ./results/report.html’ } } stage(‘Archive Report’) { steps { archiveArtifacts artifacts: ‘results/report.html’ fingerprint: true } } } }6.3 多设备并行测试对于需要覆盖大量设备的兼容性测试串行执行效率太低。Airtest支持通过多进程或多线程进行并行测试。你可以编写一个Python调度脚本使用multiprocessing或threading模块为每个设备启动一个独立的Airtest运行进程。import subprocess import multiprocessing device_list [“device_serial_1” “device_serial_2” “device_serial_3”] def run_test_on_device(device_serial): log_dir f“./logs/{device_serial}” cmd f“airtest run test_suite.air --device Android:///{device_serial} --log {log_dir}” subprocess.run(cmd shellTrue) if __name__ ‘__main__’: with multiprocessing.Pool(processeslen(device_list)) as pool: pool.map(run_test_on_device device_list)这个脚本会同时在所有设备上运行测试套件极大地提升了测试效率。7. 常见问题排查与性能优化在实际项目中你会遇到各种各样的问题。这里我总结了一些高频问题和解决方案。7.1 图像识别失败问题排查表问题现象可能原因解决方案TargetNotFoundError(找不到图片)1. 截图不准确或UI已变化。2. 屏幕分辨率/缩放比例与录制时不同。3. 图片区域被遮挡或处于动画中。4. 识别阈值(threshold)设置过高。1. 重新截取更精确、更具特征的图片。2. 使用Template的resolution参数进行适配或使用相对定位(record_pos)。3. 增加等待(wait)确保UI稳定后再识别。4. 适当降低threshold值如0.7。尝试使用灰度匹配(rgbFalse)。点击位置偏移1. 图像匹配的中心点不是可点击区域。2. 设备屏幕有圆角、刘海屏坐标计算有误。1. 在touch语句中使用target_pos参数调整点击偏移。例如touch(tpl target_pos(0.5 0.9))点击图片底部。2. 使用Poco控件操作替代图像点击。脚本在某一设备上慢图像搜索算法在全屏搜索耗时。1. 使用record_pos或target_pos缩小搜索范围。2. 先用wait等待图片出现再用touch避免反复搜索。3. 考虑升级到更高性能的设备运行测试。7.2 Poco控件识别失败问题排查问题现象可能原因解决方案PocoTargetTimeout(找不到控件)1. 控件还未加载出来。2. 定位器写错了属性值不对。3. 当前不在正确的Activity/页面。4. 对于游戏Poco-SDK未正确接入或初始化。1. 使用wait_for_appearance()或wait()增加等待时间。2. 使用Poco辅助窗重新检查控件属性使用更稳定的定位方式如id。3. 确保页面跳转已完成。可以加一个页面加载完成的等待断言。4. 检查游戏端Poco-SDK的接入文档确保poco初始化时选择了正确的模式如UnityPoco。控件属性获取为None该属性在控件树上不存在。使用Poco辅助窗确认该控件是否有此属性。对于动态内容属性可能延迟加载需要等待。操作无效如点击没反应1. 控件实际不可点击(enabledfalse)。2. 点击坐标被其他元素遮挡。3. 需要更复杂的操作如长按。1. 操作前检查控件状态。2. 尝试使用poco.click([x y])指定绝对坐标点击或先操作遮挡物。3. 使用poco.long_click()等方法。7.3 性能与稳定性优化技巧减少不必要的截图和图像识别图像识别是CPU密集型操作。尽量用Poco控件判断替代图像断言。如果必须用图像确保截图区域尽可能小。设置合理的等待与超时到处使用固定的sleep(2)是低效且脆弱的。优先使用智能等待wait(Template(...))或poco(...).wait_for_appearance()。为不同的操作设置不同的超时时间。复用Poco实例不要在每次操作时都重新初始化Poco对象。在脚本开头初始化一次全局使用。处理异常与重试机制网络波动、应用卡顿可能导致偶然失败。为关键步骤添加重试逻辑。def click_with_retry(element retries3): for i in range(retries): try: element.click() return True except Exception as e: if i retries - 1: raise e sleep(1) return False清理环境每条用例开始前确保从一个干净的状态启动如强制关闭App再启动。用例结束后也做好清理工作避免影响下一条用例。7.4 一个真实的踩坑案例游戏启动图适配我曾负责一个在几十种Android机型上测试游戏的任务。游戏启动时有一张全屏的、带动态效果的Logo图。用一张固定截图做wait断言在部分高分辨率或异形屏手机上总是失败。解决方案不依赖整张图改为截取Logo中最具辨识度、位置相对固定的一小部分比如Logo的一个角或一个特定字符。使用多张备选图针对主流分辨率1080p 2K各截一张图在脚本中依次尝试匹配。终极方案与开发协商在游戏启动后设置一个明确的、可通过Poco访问的UI控件比如一个隐藏的TextView其text为“LOADING_COMPLETE”。这样就能用poco.wait_for_appearance(“LOADING_COMPLETE”)来精确等待完全摆脱了图像识别的分辨率依赖问题。这体现了测试左移和团队协作的价值。从图像识别入门到控件操作进阶再到命令行集成和问题深度排查Airtest提供了一套从简单到复杂、从个人调试到团队集成的完整解决方案。它可能不是所有场景下的唯一选择但在处理多平台、特别是包含游戏或复杂图形界面的自动化测试需求时其独特优势非常明显。关键在于理解其原理根据实际场景灵活搭配Airtest和Poco并运用良好的脚本工程实践这样才能构建出稳定、高效的自动化测试体系。
返回列表