5 分钟写出第一个移动 UI 自动化用例:Maestro 上手实录
【免费下载链接】MaestroPainless E2E Automation for Mobile and Web项目地址: https://gitcode.com/GitHub_Trending/ma/Maestro
写移动 UI 自动化用例,动画一多就 flaky,Android、iOS 还得各写一套代码。Maestro 改用 YAML 描述 E2E 用例,解释执行、等待内置,五分钟跑通第一个用例。
第一幕:为什么"写代码"的方式让人头疼 💢
跨平台应用的 UI 测试,过去要写两套。Android 一套、iOS 一套,语言不同、API 不同,同一个登录流程实现两遍,改一个 bug 要动两个文件。
第二个痛点是 flaky。代码级框架不理解"界面是否就绪",用例只能靠 sleep 猜时机:猜短了偶发失败,猜长了 CI 越跑越慢。
Maestro 的切入点是让用例变成"文档"而不是代码。YAML 人眼可读,CLI 逐行解释执行,不需要编译;元素一时不在时,内置的重试和智能等待会接管,而不是直接判失败。
第二幕:五分钟跑通第一个移动 UI 自动化用例 ⚡
前提只有一个:Java 17 或更高。下面两条命令检查版本并安装 CLI:
java -version curl -fsSL "https://get.maestro.mobile.dev" | bash装完后运行maestro --version,打印出版本号即代表 CLI 已就位。
然后是用例本身。这段流程在系统通讯录里新建一个联系人,首行声明目标应用,之后逐行就是操作步骤:
appId: com.android.contacts --- - launchApp - tapOn: "Create new contact" - tapOn: "First Name" - inputText: "John" - tapOn: "Last Name" - inputText: "Snow" - tapOn: "Save"运行maestro test flow_contacts_android.yaml后,模拟器里应用被拉起、点击、输入、保存一气呵成,终端逐条打印 PASS,最终联系人列表里出现 John Snow,全程没有一行 Java。
仓库里这张渐变图是 CLI 录制模式使用的背景图,位于 maestro-cli/src/main/resources/:
第三幕:Maestro YAML 语法里最容易被忽略的三个写法 🙈
入门教程讲的都是tapOn和assertVisible,真正在项目里好用的是下面三个。
你可能不知道,元素可以"允许不存在"。A/B 页面和引导页里,有些按钮只出现一部分。给步骤加optional: true,元素不在就跳过,用例不判失败——仓库里 Wikipedia 的引导流程就是这么写的,见 onboarding-android.yaml。
你可能不知道,一个流程能换个数据复用。runFlow调用子流程时可以带env变量,同一个登录流程能跑不同账号。两段组合起来是这样:
# "跳过"按钮可能不存在 - tapOn: text: "Skip" optional: true # 同一流程换数据 - runFlow: "login.yaml" env: USERNAME: "ci_user" PASSWORD: "ci_pass"改 env 的值就能切换测试数据,不需要复制粘贴流程文件。
你可能不知道,还能做像素级截图对比。行内命令- assertScreenshot: "expected.png"会把当前界面和基准图逐像素比对并报告差异,适合层级结构复杂、难以用断言覆盖的页面。
这些命令在 Commands.kt 里都有对应的数据类定义,想确认某个语法存在与否,翻这个文件最快。
第四幕:真实项目里怎么落地 🛠️
以"登录流程进夜间回归"为例,关键有三步:登录步骤抽成一个子流程 login.yaml 并把账号参数化;主流程负责清状态启动应用、调用子流程;最后用assertVisible守住落点页面。
主流程只有九行,负责整体编排:
appId: com.example.myapp tags: [regression] --- - launchApp: clearState: true - runFlow: "login.yaml" env: USERNAME: "ci_user" PASSWORD: "ci_pass" - assertVisible: "Home"跑一遍maestro test nightly.yaml,日志按步骤顺序打印结果,失败时停在那一步并给出信息,不用翻长日志。
两个容易踩的坑值得记住。一是别用 sleep 等界面稳定,assertVisible本身会阻塞到元素出现,动画场景有专门的waitForAnimationToEnd。二是 web 流程依赖本地静态服务,服务没起就开跑,launchApp不报错但用例会以"元素找不到"失败,报错指向完全不是真因,e2e 目录的 README 里专门记录了这个现象。
值不值得现在就开始
需要维护 Android 或 iOS 的 UI 回归测试时,Maestro 值得优先尝试:用例是纯文本文件,代码评审友好,非测试同学也能读懂。如果只是一次性验证,或者团队已深度投入代码级框架、只需少量复杂自定义手势,可以先跑官方样例感受一下再决定。下一步很简单:执行maestro download-samples拉取样例应用和流程,在模拟器上完整走一遍。
【免费下载链接】MaestroPainless E2E Automation for Mobile and Web项目地址: https://gitcode.com/GitHub_Trending/ma/Maestro
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考