包括首个 AI 驱动的命令、新的分片选项、iOS 横屏支持,以及许多错误修复和稳定性改进。
自上次发布 Maestro v1.37.0 已超过三个月。今天,我们很高兴向您推出 v1.39.0。
新的 AI 驱动命令
此版本引入了首批 AI 驱动命令:assertWithAI
和 assertNoDefectsWithAI
。
“什么?AI 驱动的命令?什么时候应该使用它们?”很高兴你问了这个问题!
Maestro 的命令非常出色:可靠且确定性强。但现实世界不是这样的,有时很难,甚至不可能,将某些情况表达为明确的条件。
看看下面这个简单的例子。对我们人类来说,很明显这个屏幕存在按钮重叠的问题(除了真的很丑以外,但我们暂且不管这个):
两个按钮都可见且可以点击,因此像 assertVisible
这样的常规命令会通过,而 tapOn
也可以工作。如何捕捉到这个问题?您可以使用 assertNoDefectsWithAI
:
-
assertNoDefectsWithAI
真的不能更简单了。现在,您可以收到明显出错的通知。
如果您想执行特定的断言,还可以使用 assertWithAI
。得益于这个功能,您可以对断言做出大胆尝试!
- assertWithAI:
assertion: A picture of a cute bunny is visible
optional: true
查看我们的文档以了解如何在 Maestro 中配置 AI。简而言之,您需要提供自己的 OpenAI(或 Anthropic)API 密钥并将其作为环境变量导出。
我们是怎么想到这个主意的?
我们查看了问题跟踪器,发现当前获赞最多的问题是 #1222,其作者请求添加新命令以比较不同运行中的截图,以确保 UI 没有破坏。
截图测试有各种名称:原生 Android/iOS 社区称之为快照测试,Flutter 社区使用 "golden tests" 这个术语,还有 "baseline tests" 在流传。我们认为它们都是相同的概念。
这个问题是合理的,我们甚至开始实施它,但后来我们问自己:我们可以尝试做一些不同的事情吗?
截图测试的主要问题在于维护基准——这些“正确的”截图必须被检查并提交到 git 仓库中并进行维护。我们自己也经历过这种痛苦,并思考如何摆脱基准的束缚。不久之后我们决定使用 LLMs。
AI 驱动命令的下一步是什么?
Maestro 与 AI 的集成仍处于早期阶段,但从早期采用者的反馈来看,我们确信我们走在正确的方向上,前景非常广阔。我们看到了这一功能的巨大潜力,对其未来改进感到非常兴奋。
当然,请放心——我们仍然希望添加对传统截图测试的支持。我们认识到它在许多需要可预测性的场景中很有用——敬请关注!
并行执行改进
来自 Tarek Belkahia 的 PR #1955
在此版本中,您可以为 maestro test
命令传递两个新的互斥选项:--shard-all <N>
和 --shard-split <N>
,其中 N 是要运行测试的设备数量。
-
--shard-split <N>
与现在弃用的--shard <N>
选项相同(将在未来版本中移除)——它将您的测试套件分成若干块,并在不同设备上运行每块,从而加速测试。 - 新的
--shard-all
略有不同。假设您想确保所有流程都能在小屏手机、大屏手机(有人还记得“平板手机”这个词吗?)和一台平板电脑上通过。--shard-all
就让您能在每个连接的设备上运行所有流程。
CLI 运行分片测试的输出也得到了改进:
改进后的终端输出使您可以轻松查看分片测试套件的状态。
iOS 横屏模式
这是一个长期存在的问题,但现在不再是问题了!
重要错误修复
- 允许在
setLocation
和travel
命令中使用环境变量(#1988 由 Prasanta Biswas 提交) - 修复了 JavaScript 输出使用整数导致反序列化错误的问题(#1788 由 Muhammed Furkan Boran 提交)
- 修复了在
flowsOrder
指定工作空间中的所有测试时没有测试被运行的问题(#2003) - 修复了“BlockingCoroutine 正在取消”的混乱错误消息(#2036)
查看更新日志以获取完整列表。
Rhino JavaScript 引擎的即将弃用
Maestro 当前的默认 JavaScript 引擎是 RhinoJS。它可以处理简单脚本,但并没有实现现代 ECMAScript 标准——实际上,它停留在 ES5,这大大降低了它的实用性。
幸运的是,Maestro 也支持 GraalJS——一个支持 ECMAScript 2022 的更强大的 JavaScript 引擎。GraalJS 自 2023 年 6 月发布的版本 1.30.0 起就已经可以在 Maestro 中使用。未来,我们将把 GraalJS 作为默认的 JavaScript 引擎,然后移除 RhinoJS。
查看这个问题以了解我们如何推进这一变更。我们建议尽快切换到 GraalJS——如果在此过程中遇到任何回归,请创建一个问题并告知我们!
总结
本次发布就到此为止!
我们要感谢社区中所有测试新更改、创建功能请求和错误报告的成员。
特别感谢 Tarek Belkahia——一位 Maestro 社区的长期成员和热心的开源贡献者。本次发布的大部分错误修复和新功能都是他工作的成果。非常感谢,Tarek!