关于 momentic-result-classification
这是一个调查并分类 Momentic 端到端测试运行故障的技能。它强调找到最早出现异常的状态,并依据截图、跟踪记录和步骤结果说明根因。
主要功能
- 01追溯到最早出现偏差的步骤
- 02检查截图、跟踪记录和步骤结果
- 03比较当前运行与历史运行
- 04识别定位器和缓存问题
- 05提交最终分类结论
适用场景
- 01诊断浏览器测试失败原因
- 02区分应用问题与测试问题
- 03调查恢复后或重复步骤的故障
MCP 相关
该技能使用 Momentic MCP 工具获取运行元数据、步骤结果、测试步骤和运行历史,并提交故障分类结论。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ momentic-ai/ skills --skill momentic-result-classification安装后在 Claude Code 中输入/momentic-result-classification确认已加载。
详细介绍
Momentic 结果分类(MCP)
Momentic 是一个端到端测试框架,每项测试都由浏览器交互步骤组成。每个步骤都将 Momentic 特有的行为(AI 检查、自然语言定位器、AI 操作等)与封装在 YAML 步骤架构中的 Playwright 功能结合起来。运行这些测试时,会生成可用于分析测试结果的数据。结果数据包含有关运行的元数据,以及运行生成的各种资源(例如,屏幕截图、日志、网络请求、视频录制等)。你的任务是使用这些测试结果,对 Momentic 测试运行中发生的失败进行分类。
说明
- 对于失败的测试运行,找出当前运行首次进入异常状态的位置。不要停在最终失败的断言或缺失的定位器目标处。
- 在操作/状态层面解释根本原因:哪个步骤尝试执行什么操作、它依赖的具体元素或状态是什么、实际发生了什么,以及哪些证据可以证明这一点。
- 将失败归入以下某个类别,并解释选择该类别的理由。
实用 MCP 工具
momentic_get_run — 返回运行的部分元数据和完整运行结果摘要。使用元数据帮助解析运行结果(例如,要查看哪次尝试、哪个步骤失败等)。如果当前运行详情已在初始上下文中提供,除非明确需要查看其他尝试,否则不要再次为同一运行调用此工具。
momentic_list_runs — 列出某项测试最近的运行,以便比较其结果随时间的变化。如果相关运行中存在 gitBranchName,务必传入该参数,这样更有可能查看到相同版本的测试。需要查看其他分支的运行时则省略该参数。需要检查已恢复的运行时,传入 recovered=true。
momentic_get_step_result — 返回特定步骤的结果,以及完整步骤跟踪记录、前后截图等信息。对于嵌套在其他步骤中的步骤,请使用 parentStepIdChain。仅在需要时才请求 includeTrace=true,因为结果可能非常大。
momentic_get_test_steps_for_run — 返回某次运行中记录的简化测试步骤(stepsSnapshot、beforeStepsSnapshot、afterStepsSnapshot)。如果无法仅凭测试名称和说明了解测试意图,可以使用此工具。
momentic_submit_result_classification — 保存某次运行的分类判定。仅在完成调查并准备记录最终分类后调用。传入 runId 以及下文“正式分类输出”部分所述的字段。
调查工作流
在依赖历史记录之前,先检查当前运行。
- 调用
momentic_get_run,找出失败的尝试、区段(beforeSteps、主步骤或afterSteps)、失败步骤以及任何parentStepIdChain。 - 获取失败步骤的结果,包括屏幕截图和跟踪记录。如果步骤是嵌套的,也要获取最近的父容器或模块结果。
- 判断该步骤的前置屏幕截图是否是该操作的正确基线。如果已经不正确,则沿当前运行向前回溯,直到找到产生错误状态的步骤或容器。
- 对于重复模块或重复工作流,先比较同一次当前运行中的调用,再比较较早的运行。后续失败通常由较早的一次调用导致,而该调用可能成功、恢复了状态,或留下了无效的后置条件。
- 对于包含失败或恢复子步骤的成功容器,在检查容器最终的后置屏幕截图和 URL 之前,应将其视为部分失败。
- 只有在了解当前运行的行为后,才将以往运行用于具体的比较问题。
在分类之前,确保能回答以下问题:
- 测试预期执行什么行为?
- 最早出现偏差的步骤或容器是什么?
- 该步骤原本要做什么?
- 它实际与哪个元素或状态交互,或观察到了什么?
- 该步骤之后,屏幕截图、URL、DOM、跟踪记录或恢复日志发生了什么变化?
- 为什么后续失败是由较早的偏差导致的?
避免使用“设置不可靠”或“页面状态不正确”等模糊的根因描述。应直接指出失效的后置条件,例如:“点击了行级加号按钮,但应用仍停留在父页面,没有打开子页面编辑器;随后针对通用 Add to 的断言匹配到了无关的页面文本,因此未指定目标的输入步骤从未填写子页面标题。”
证据标准
- 屏幕截图是判断页面状态的默认依据。使用跟踪字段和 DOM/HTML 解释屏幕截图为何发生或未发生变化。
- 核实每一项因果主张。除非相关的前置/后置屏幕截图、URL 或 DOM 能证明存在覆盖层、侧边预览、模态框或菜单,否则不要声称其存在。
- 区分“目标现在不存在”和“浏览器处于目标应当存在的状态”。目标缺失通常是较早操作失败的症状。
- 对于点击/输入/操作步骤,记录预期操作、实际交互的元素(如有)、前后 URL,以及预期的 UI 状态是否出现。
- 对于断言,检查其范围是否足够精确,以证明预期状态。宽泛的页面内容断言可能会匹配到无关文本。
- 对于恢复操作,同时检查失败的子步骤和恢复后容器的最终状态。恢复可能会通过重试断言,却留下后续步骤未预期的状态。
背景
测试运行结果结构
通过 CLI 运行 momentic 测试时,结果会存储在一个“运行组”中。该运行组的数据存储在 momentic 项目中的单个目录内。默认目录名为 test-results,但可在 momentic 项目设置中或运行组的单次运行中更改。运行组结果文件夹的结构如下:
test-results/
├── metadata.json data about the run group, including git metadata and timing info.
└── runs/ On zip for each test run in the run group.
├── <runId_1>.zip a zipped run directory containing data about this specific test run. Follows the structure described below.
└── <runId_2>.zip
解压后,运行目录的结构如下:
<runId>/
├── metadata.json run-level metadata.
└── attempts/<n>/ one folder per attempt (1-based n).
├── metadata.json attempt outcome and step results.
├── console.json optional browser console output.
└── assets/
├── <snapshotId>.jpeg before/after screenshot for each step (see attempt metadata.json for snapshot ID).
├── <snapshotId>.html before/after DOM snapshot for each step (see attempt metadata.json for snapshot ID).
├── har-pages.log HAR pages (ndjson).
├── har-entries.log HAR network entries (ndjson).
├── resource-usage.ndjson CPU/memory samples taken during the attempt.
├── <videoName> video recording (when video recording is enabled).
└── browser-crash.zip browser crash dump (only present on crash).
通过 momentic MCP 获取运行结果时,momentic_get_run 等工具会返回指向 MCP 工作目录(默认为 .momentic-mcp)的链接。该目录将包含按上述结构解压的运行结果文件夹,名称为 run-result-<runId>。
元素定位器
某些与元素交互的步骤类型具有一个“target”属性(也称为定位器),用于指定该步骤应与哪个元素交互。
定位器缓存
定位器会将页面状态 HTML/XML 和屏幕截图发送给大模型,以识别页面上的元素。大模型会识别用户指的是页面上的哪个元素。Momentic 会尝试“缓存”大模型给出的答案,这样后续运行就无需调用 AI。后续运行时,系统会将页面状态与缓存的元素进行比对,以确定该元素是否仍可用,或页面是否发生了足够大的变化,需要再次调用 AI。
定位器缓存可能因多种原因失效:
- 元素描述已更改,此时缓存总会失效
- 在当前页面状态中找不到缓存的元素
- 在页面状态中找到了缓存的元素,但未通过缓存条目中指定的某些检查,例如要求元素处于特定位置、形状或内容
只有明确请求 includeTrace=true 时,才能在某个步骤结果的 trace 属性中找到 cacheBustReason。结果中也会列出 cache 属性,其中包含为该元素保存的完整缓存。
识别错误缓存
有时,缓存的元素并非用户原本想要定位的元素。这可能导致测试失败或出现意外行为。在这种情况下,核实最初为何保存了错误的缓存会很有帮助。仅在调试此类缓存问题或怀疑 Momentic 执行数据不正确时,才请求 includeTrace=true。使用错误缓存中 targetUpdateLoggerTags 的 runId 属性获取原始运行的详细信息,并调用 momentic_get_run,传入此 runId。这会返回缓存目标被更新时对应的运行记录。
模块缓存
当模块缓存键和解析后的输入未发生变化时,缓存模块会跳过其步骤的执行,并复用模块上一步的缓存返回值。
身份验证模块还可以通过模块缓存保存和恢复浏览器身份验证状态,包括 Cookie、localStorage 和 IndexedDB。恢复身份验证状态后,它们可能会检查页面内容,以判断缓存是否仍然有效。
文件上传
文件上传步骤会为下一个原生文件选择器准备一个文件,因此必须在打开选择器的操作之前运行。
来源可以是远程 URL、指向先前下载内容的 file:// 引用、CLI 本地路径或用户上传的文件。此步骤还可以覆盖显示的文件名,Momentic 会将准备好的文件接入浏览器的文件选择器处理流程。
使用过往运行记录
过往运行记录是用于比对的依据,不能替代对当前运行情况的还原。当当前运行无法回答以下问题时,请使用过往运行记录:
- 此测试从什么时候开始失败?
- 与上一次通过的运行相比,有什么不同?
- 同一操作在之前的运行中是否表现不同?
- 这是测试薄弱、应用发生变化、应用存在真实缺陷,还是暂时变慢?
使用过往运行记录中的步骤结果和屏幕截图来回答这些问题。不要仅依靠 momentic_get_run 或 momentic_list_runs 的摘要来了解测试运行中发生了什么。在引用过往运行记录作为依据之前,请查看具体的运行详情,包括步骤结果和屏幕截图。
查看过往运行记录时,请按以下工作流操作:
- 调用
momentic_list_runs工具,确定需要进一步查看的运行记录。如果相关运行记录中有gitBranchName,务必传入该参数。需要查看其他分支的运行记录时,则省略此参数。 - 调用
momentic_get_run,获取该次运行的详细信息。 - 调用
momentic_get_step_result,查看要比对的相同步骤/容器,或最接近的等效步骤/容器,尤其是屏幕截图。
如果当前运行已能证明根本原因,导致过往运行记录无关紧要,请简要说明,而不要勉强引用历史依据。
多次尝试的运行
当 momentic_list_runs 显示某次运行通过且 attempts > 1 时,应将其视为值得调查的部分失败,而非干净的通过。使用 attemptNumber 参数获取该次运行较早失败的尝试结果,了解重试成功前出了什么问题。
不稳定性和间歇性失败
- 只有同一应用和测试行为出现间歇性失败,才应将测试视为不稳定或间歇性失败。
- 测试只失败过一次,并不意味着它不稳定。失败可能是由应用变更导致的。
- 你需要分析屏幕截图和其他运行数据,判断运行之间是否发生了应用或测试变更。
- 在确认失败是否由应用或测试变更导致之前,不能对不稳定性或间歇性失败妄下结论。
测试时效性
- 过去的结果未必与今天的测试文件相符。测试可能已发生变化,这意味着过去的结果对应的是不同版本的测试。
- 你可以调用
get_test_steps_for_run,帮助判断不同运行之间测试本身是否发生了变化。不过请注意,该工具返回的是每个测试步骤的_摘要_。如果怀疑某些步骤的具体细节在测试运行之间发生了变化,momentic_get_step_result的响应中包含完整的步骤详情;只有当这些字段和屏幕截图仍不足以判断时,才请求includeTrace=true。
需要留意的常见失败模式
- 设置模块看似通过,却留下了错误的页面、覆盖层、筛选条件、搜索内容、选中行或侧边预览。应根据留下错误后置条件的步骤或容器进行分类,而不只是看接下来失败的步骤。
- 点击报告成功且目标元素正确,但应用没有切换到预期状态。请验证后置状态;不要因为定位器正确就假定点击成功。
- 较弱的全局断言(例如“页面包含 X”)可能因为页面上无关的文字而通过。下一步可能因此在错误的上下文中输入或点击。
- 如果前一步操作未能将焦点移至预期字段,没有指定具体目标的输入步骤可能会悄无声息地输入到无用位置。
- 定位器或缓存可能在技术上有效,但语义上不正确。请检查交互的元素;对于错误缓存,请检查
targetUpdateLoggerTags.runId对应的原始缓存更新运行。 - 已恢复的步骤可能掩盖首次失败。请检查已恢复模块中的失败子步骤,并将恢复后的最终状态与下一步预期的基准状态进行比较。
- 超时不应自动归类为
INFRA。应先排除数据缺失、页面状态错误、应用流程变更、定位器或断言错误,以及设置失败。
判断问题是否相关
- 使用测试名称、描述,以及必要时使用
momentic_get_test_steps_for_run返回的简化测试步骤,判断测试旨在验证什么。 - 超出该意图范围的失败属于无关问题,否则应视为相关问题。
- 设置阶段(
beforeSteps或beforeResults)或拆卸阶段(afterSteps或afterResults)中的失败,几乎总是无关问题。 - 相关与否仅适用于 Bug 和变更。例如,无论
INFRA失败发生在设置阶段还是主要部分,它都仍然属于INFRA。
Bug 与变更
- Bug:明显不该发生的情况确实发生了,例如出现错误消息。只看一两个步骤就能确定这是 Bug。
- 变更:应用行为发生了明确变化,并且可以通过屏幕截图证明。
可恢复性
除了类别之外,还要确定一个可恢复性值:
RECOVERABLE— 可以通过自动更新测试本身来修复故障,使后续运行通过。- 示例:应用变更导致测试需要更新;含糊的定位器或断言可以改写,以稳定通过。
ONE_TIME_RECOVERABLE— 无需持久化修改测试,即可恢复本次运行。- 示例:可以关闭且不影响测试目的的随机弹窗;等待或重试可能奏效的临时延迟。
NON_RECOVERABLE— 无法自动处理故障,需要人工介入。- 示例:缺少凭据;上传所需的本地文件缺失;可能由第三方系统导致、且测试步骤无法解决的服务中断。
正式分类输出
- 只能有一个类别 ID,不得添加新标签,也不得使用多个标签。
- 根据数据作出判断。分配类别之前,务必全面调查本次运行。
- 如果步骤/模块可以用通俗名称识别,优先使用便于阅读的引用,而不是 UUID:
module create-subpage-under-parent-page、the last invocation of module <name>、substep 4 (0-indexed)、the failed setup assertion等。工具调用仍需使用准确 ID,但最终说明应易于阅读。 - 在最终输出中引用以往运行时,请使用可点击的 Momentic URL,而不是单独的 UUID:
https://app.momentic.ai/runs/<runId>。不要缩短这些 URL 中的 UUID。 - 说明必须指出最早出现分歧的步骤/容器,以及由此导致的后置条件失效,而不只是指出最终失败的步骤。
Reasoning: <a few sentences tied to the earliest divergence, screenshots/traces, past runs if used, and test intent>
Category: <one id from the list>
Recoverable: <RECOVERABLE | ONE_TIME_RECOVERABLE | NON_RECOVERABLE>
Confidence: <high | medium | low>
置信度级别:
high— 有直接证据,例如清晰显示标签变更或崩溃的屏幕截图medium— 多个信号支持强推断,但没有单一确凿的屏幕截图或数据点low— 证据模糊;分类需要大量推断,或根本原因不明确
类别 ID
请原样使用以下字符串:
NO_FAILURE— 本次运行没有失败;所有尝试均已通过。APPLICATION_CHANGE— 测试已过时,因为应用的流程或 UI 已发生变化;将测试更新为符合新行为即可永久修复此次失败。BUG— 应用中明显出现了不该发生的问题,例如显示错误消息或预期内容未能呈现。TEST_AUTHORSHIP— 可以永久更新测试,在验证其原始意图的同时避免此次失败;并且你可以建议具体的编写修改,例如添加或修改步骤、重写含糊的断言,或让定位器描述更加具体。如果无法指出具体修改,请选择其他类别。超时、页面加载缓慢,以及任何建议修复方法为“等待更久”或增加超时时间的失败,都不属于测试编写问题——这些属于INFRA,即使理论上可以编辑测试来延长等待时间也一样。- 示例:可通过添加或修改非等待/超时步骤来修复的竞态条件(例如,将“输入并按 Enter”步骤替换为明确的“从列表中选择”步骤,使测试不再与应用发生竞态);可以改写得更加具体的含糊断言或定位器描述。
TEST_SETUP— 运行测试所需的测试数据或文件缺失,且修复需要在测试本身之外由用户操作。- 示例:文件上传步骤所需的文件缺失;测试所需的凭据缺失或不正确。
INFRA— 此次失败与应用或应用代码无关,是由基础设施中断、加载时间过长或其他外部因素导致的。- 示例:浏览器崩溃;资源占用过高;速率限制;某个步骤或断言因页面或应用缓慢但最终会达到预期状态而超时。
MOMENTIC_ISSUE— 测试执行出现问题,或 Momentic 数据有误(例如缓存错误、全局定位器重定向行为异常、AI 产生幻觉)。- 示例:查看运行跟踪记录时出现意外行为;AI 明显误读或臆造了截图中清晰无误的数据,且没有合理的测试替代方案可以避开 AI 步骤。
OTHER— 此次失败不属于其他任何类别。