30 分钟跑通跨平台 UI 自动化:一套 YAML 写完整登录回归测试
【免费下载链接】MaestroPainless E2E Automation for Mobile and Web项目地址: https://gitcode.com/GitHub_Trending/ma/Maestro
🔥 上个发版夜,37 条用例红了 12 条,定位半天才发现不是 bug,是点击时元素还没加载。后来我改用 Maestro——基于 YAML 测试的跨平台 UI 自动化,一个脚本同时跑 Android 和 iOS,登录回归从此只维护一份。
为什么写跨平台 UI 自动化测试时选了 Maestro
按平台各写一套原生测试,一个登录流程就是三套代码:Android 用 Espresso,iOS 用 XCTest,Web 用 Selenium,UI 一改要改三处。Maestro 的差异点有三个:全部命令写在 YAML 里,新人一天就能读懂;assertVisible这类断言是声明式的,你写的是"什么该成立",而不是"该怎么点";每条命令都内置自动等待,不必靠 sleep 硬扛时机问题。它是开源免费的项目,安装一条命令,语法一页纸能看完。
环境就绪,接下来让脚本真正跑起来。
如何安装 Maestro 并 5 分钟跑通第一个 YAML 脚本
先装。macOS、Linux、Windows WSL 都适用,唯一前置是 Java 17 以上,用java -version确认过再往下走:
curl -fsSL "https://get.maestro.mobile.dev" | bash然后写一个最小 flow。先不写业务,就用系统自带通讯录 App——任何模拟器上都有,不用装应用,最适合验证工具链:
# first.yaml —— 先确认链路通,别急着碰业务 appId: com.android.contacts --- - launchApp - tapOn: "First Name" - inputText: "John" - tapOn: "Last Name" - inputText: "Snow" - tapOn: "Save" - assertVisible: "John Snow"maestro test first.yaml终端里看到整条流程变绿,就说明环境没问题。现在不用纠结每一行,后面用熟了自然懂。如果终端提示没找到设备,先开一个模拟器或插上真机再跑,Maestro 会自己列出已连接的设备。
如何给电商 App 写一套完整的登录回归测试
回到目标:把"正常账号登录 → 落到订单页"这件事跑稳。写法是分层叠加:先骨架,再遇到问题补什么,每一步都清楚自己在解决什么。
先写裸流程,文案用你应用 UI 上的真实文字:
appId: com.example.shop --- - launchApp: clearState: true # 清掉残留状态,上次测试的脏数据不能带进这次 - tapOn: "我的账户" - tapOn: "用户名" - inputText: "standard_user" - tapOn: "密码" - inputText: "secret_sauce" - tapOn: "登录" - assertVisible: "我的订单"能跑了,但新测试机会卡在验证码弹窗——脚本不知道这回事,会一直等一个不存在的输入框直到超时。加个分支,让脚本自己决策:
# 有验证码就走输入分支,没有就直接跳过,不让脚本原地等死 - if: visible: "输入验证码" then: - inputText: "123456" else: - tapOn: "跳过验证"第二个问题是测试数据:两个人在共享环境跑同一个写死的手机号,账号互相顶,失败原因查半天。手机号改成随机生成:
# 每次跑随机生成,同环境多人执行互不冲突 - tapOn: "手机号" - inputRandomNumber最后是时机。弱网下从点登录到订单页出现要 8 秒,默认窗口偶发不够。与其加 sleep,不如给关键断言显式超时,让 Maestro 自己去轮询:
- assertVisible: text: "我的订单" timeout: 15000 # 给最慢的那台 CI 机器留足余量完整脚本二十多行,从上到下读下来就是一条操作动线。这就是 YAML 语法的回报:review 脚本时你不需要在脑子里翻译"哪个类里哪个方法调了什么",看到的就是读到的。
脚本能跑了,但"能跑"离"稳定跑"还差一口气,尤其是进了 CI 之后。
当 Maestro 出现定位漂移和 CI 时序问题时怎么修
当按钮文案漂移的时候:产品把"登录"改成"立即登录",整套脚本全红,你得逐行改定位符。改成 contains 而不是精确匹配,因为按钮文案是 UI 里最常随版本微调的部分,contains 同时兼容新旧两版文案:
- tapOn: text: contains: "登录"当本地过而 CI 超时的的时候:CI 机器通常比你本机慢,写 sleep 只是把一种不稳定换成另一种——写短了照样超时,写长了整套回归变慢。给断言更大的超时,让 Maestro 自己等到元素真正出现:
- assertVisible: text: "订单列表" timeout: 15000如何在 CI 里跑 Maestro 并多端并行
接入日常流程只加一行,传脚本目录即可批量执行:
maestro test flows/ --shard-split 3--shard-split 3会把所有 flow 切成 3 片,分派到 3 台模拟器或真机上并行,三端回归一杯水的工夫跑完。跑完默认在当前目录生成 HTML 报告(report.html),每个失败点都带逐步截图;--format可换格式,接 CI 结果页用 JUnit 格式最顺手。更完整的分片与并行参数,翻官方文档对应章节即可。
一套 YAML 三端通用,免费开源,今天写的登录脚本就是第一块砖。放进 nightly 回归,让它今晚先跑起来。🚀
【免费下载链接】MaestroPainless E2E Automation for Mobile and Web项目地址: https://gitcode.com/GitHub_Trending/ma/Maestro
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考