Maestro 实战指南:5 个场景带你跑通并跑稳移动端 UI 自动化测试流
【免费下载链接】MaestroPainless E2E Automation for Mobile and Web项目地址: https://gitcode.com/GitHub_Trending/ma/Maestro
如果你是想用 YAML 测试流驱动 Android 和 iOS 的移动端测试工程师,这篇 Maestro 实战记录会带你走一遍真实使用路径:装环境、写第一条测试流、驯服不稳定用例、批量适配多设备,最后走到源码贡献。
场景一 · 跑起来:三步装好 Maestro 并完成环境配置
先排除一个常见误区:装 Maestro 不是"下载压缩包解压",而是装一个终端 CLI 工具,装完后你得到的是maestro命令本身。它依赖 Java,机器上先备好 Java 11+(仅运行发布版测试流的话,运行时兼容到 Java 8;从源码构建才必须 11+)。
java -version curl -fsSL "https://get.maestro.mobile.dev" | bash maestro --version最后一条能打出版本号,就算装好了。
提示 command not found?环境变量没生效
默认安装目录是~/.maestro/bin,终端认不出maestro基本就是 PATH 没带上它。往~/.bashrc或~/.zshrc里补一行,再重开终端:
export PATH="$HOME/.maestro/bin:$PATH"⚠️ Windows 用户请在 WSL 里安装,脚本没法直接在 CMD 或 PowerShell 里跑。要是网络不通导致下载失败,可以 clone 仓库后手动执行仓库里的安装脚本,效果一样。
命令跑通后,下一步就是写出你的第一条测试流。
场景二 · 写出第一条测试流:从 tapOn 到 assertVisible
Maestro 的测试流就是一个 YAML 文件:头部写appId等元数据,---分隔线之后是一串步骤,每步一个动作或断言。仓库里表单登录示例的开头长这样:
- launchApp: clearState: true - tapOn: Email - inputText: correct@mobile.dev第一行清状态启动应用,后面是"点输入框、填值"。注意整段没有任何 sleep 调用——这是 Maestro 和传统脚本最大的区别:智能等待机制会在每步执行前轮询 UI 状态,元素就绪才继续,加载慢的界面也不用你猜时间。
元素总是定位不到?三步排查法
- 先用 Maestro Studio 的元素检查器逐字核对屏幕上的文本,别靠肉眼看截图猜,视觉误差是头号原因;
- 同文本元素出现多个时,用
index指定第几个:
- tapOn: text: Login index: 1- 还找不到原因,就加
--verbose重跑一次,日志落在~/.maestro/tests/*/maestro.log,里面能看到元素查找的全过程。
滑动、点按手势怎么写?全部用百分比坐标
绝对像素坐标换台设备就作废,所以 Maestro 的定位坐标都是相对屏幕的百分比。看仓库里手势测试示例:
- swipe: start: 15%, 50% end: 85%, 85% duration: 1000从屏幕左侧中部滑到右下角,同一份流在手机和平板上都能跑。💡 不想手算坐标的话,用 Studio 的录制功能直接在屏幕上比划,坐标会自动生成。
第一条测试流跑绿之后,接下来最常见的头疼事就是稳定性。
场景三 · 驯服不稳定的测试:不写 sleep 也要让用例稳定过
Flaky 用例基本来自两个源头:UI 状态没跟上,以及用例之间残留数据。前者智能等待机制已经消化了大部分,你要做的是让断言"松一点"、给动作"加保险"。
断言在 CI 上偶发失败?先试 optional 和 retry
对非关键检查加optional: true,这一步失败不会拖垮整个流,适合"锦上添花"式的验证(仓库 fill_form 示例里就有这么一条带注释的 optional 断言)。而对容易失手的关键动作,用retry包住它:
- retry: maxRetries: 3 commands: - tapOn: Submit技巧在这里:整体容忍度不够时,还可以在命令行给整个流加超时——maestro test --timeout 60 flow.yaml,单位秒。
用例之间数据残留?开头清一次状态
上一条用例跑完留下的登录态、购物车、缓存,会让下一条用例的行为变得不可预测。我养成的习惯是每个用例开头都带上:
- launchApp: clearState: true说白了就是等效于卸载重装,用户数据全清。维基百科子流程示例的启动步骤就是这个套路,干净的状态是一切断言可信的前提。
用例能稳定跑了,下一个问题自然是:怎么喂数据、怎么复用、怎么铺到多台设备上。
场景四 · 规模化与提效:参数化、子流程复用与多设备兼容一次搞定
测试数据硬编码?换成环境变量注入
账号、地址、开关这类值写在 YAML 里,换一套环境就得改文件。用${变量名}引用,运行时注入即可。仓库里的 environment-variables 示例流就是这么断言的:
- assertTrue: ${MAESTRO_EXAMPLE == 'test-value'}执行时用maestro test --env-file .env flow.yaml加载变量文件,dev 和 staging 之间切数据,脚本一行不用动。
公共步骤重复写?抽成子流程
"启动应用、走完新手引导、登录"这套动作出现在几十个用例里,就该写一次然后引用:
- runFlow: subflows/launch-clearstate-android.yaml仓库的 wikipedia 示例就是这个组织方式:公共启动流程放进subflows/目录,Android 和 iOS 的主流程各自引用。改引导逻辑时只动一处,所有用例跟着生效。
多设备跑同一份流?坐标交给百分比
只要你全程用百分比坐标(场景二讲过),同一份流在不同分辨率上行为一致,再配合命令行选目标设备:
maestro test --device-id emulator-5554 flow.yaml✅ 一个提醒:Android 10 以上和 iOS 14 以上的自动化支持最完整,低版本系统某些能力可能受限,真机矩阵规划时留意。
流稳定了也能批量跑了,最后看看项目内部长什么样,顺便铺一条贡献之路。
场景五 · 深入与贡献:从命令清单到自定义命令的开发路径
想读 Maestro 源码,先认准两个文件:
- Commands.kt:所有内置命令实现的接口层,命令的"名册"
Orchestra.kt(maestro-orchestra 模块):每条命令真正的执行逻辑所在
新增自定义命令的路径大致是四步:定义 Command 实现 → 在命令模型层加对应数据类 → 在 Orchestra 里写执行逻辑 → 补上 YAML 解析映射。CONTRIBUTING.md 里的 "Add new command" 章节有更细的说明,照着走不迷路。
想调试 iOS runner?手动把它跑起来
iOS 侧测试由设备上的 XCTest runner 进程执行,日志在~/Library/Logs/maestro/xctest_runner_logs。遇到启动诡异的问题,手动拉起 runner 复现最快:
./maestro-ios-xctest-runner/run-maestro-ios-runner.shrunner 起来后会开一个 HTTP 端口,直接 curl 它的deviceInfo接口就能确认服务状态。
最后说个提效利器:Maestro CLI 内置的录制功能,把你在界面上的操作录下来直接生成 YAML 测试流,它的界面背景就是仓库资源目录里的 record-background.jpg:
常用命令速查表
| 命令 | 用途 |
|---|---|
maestro test flow.yaml | 运行单个测试流 |
maestro test --verbose flow.yaml | 带详细日志排查元素查找过程 |
maestro test --env-file .env flow.yaml | 通过环境变量注入测试数据 |
maestro test --device-id <id> flow.yaml | 指定目标设备 |
maestro test --timeout 60 flow.yaml | 延长整体超时(秒) |
maestro studio | 打开图形化录制与元素检查工具 |
下一步:去e2e/workspaces/web/目录把官方示例流跑几遍找手感;想加自己的命令,就从 maestro-orchestra-models 的命令实现结构读起。
【免费下载链接】MaestroPainless E2E Automation for Mobile and Web项目地址: https://gitcode.com/GitHub_Trending/ma/Maestro
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考