mcpField
M
momentic-result-classification

momentic-result-classification

github.com/momentic-ai测试与质量1668.5k 次安装今天更新
代码仓库

关于 momentic-result-classification

这是一个调查并分类 Momentic 端到端测试运行故障的技能。它强调找到最早出现异常的状态,并依据截图、跟踪记录和步骤结果说明根因。

主要功能

  1. 01追溯到最早出现偏差的步骤
  2. 02检查截图、跟踪记录和步骤结果
  3. 03比较当前运行与历史运行
  4. 04识别定位器和缓存问题
  5. 05提交最终分类结论

适用场景

  1. 01诊断浏览器测试失败原因
  2. 02区分应用问题与测试问题
  3. 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 测试运行中发生的失败进行分类。

说明

  1. 对于失败的测试运行,找出当前运行首次进入异常状态的位置。不要停在最终失败的断言或缺失的定位器目标处。
  2. 在操作/状态层面解释根本原因:哪个步骤尝试执行什么操作、它依赖的具体元素或状态是什么、实际发生了什么,以及哪些证据可以证明这一点。
  3. 将失败归入以下某个类别,并解释选择该类别的理由。

实用 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 以及下文“正式分类输出”部分所述的字段。

调查工作流

在依赖历史记录之前,先检查当前运行。

  1. 调用 momentic_get_run,找出失败的尝试、区段(beforeSteps、主步骤或 afterSteps)、失败步骤以及任何 parentStepIdChain。
  2. 获取失败步骤的结果,包括屏幕截图和跟踪记录。如果步骤是嵌套的,也要获取最近的父容器或模块结果。
  3. 判断该步骤的前置屏幕截图是否是该操作的正确基线。如果已经不正确,则沿当前运行向前回溯,直到找到产生错误状态的步骤或容器。
  4. 对于重复模块或重复工作流,先比较同一次当前运行中的调用,再比较较早的运行。后续失败通常由较早的一次调用导致,而该调用可能成功、恢复了状态,或留下了无效的后置条件。
  5. 对于包含失败或恢复子步骤的成功容器,在检查容器最终的后置屏幕截图和 URL 之前,应将其视为部分失败。
  6. 只有在了解当前运行的行为后,才将以往运行用于具体的比较问题。

在分类之前,确保能回答以下问题:

  • 测试预期执行什么行为?
  • 最早出现偏差的步骤或容器是什么?
  • 该步骤原本要做什么?
  • 它实际与哪个元素或状态交互,或观察到了什么?
  • 该步骤之后,屏幕截图、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 的摘要来了解测试运行中发生了什么。在引用过往运行记录作为依据之前,请查看具体的运行详情,包括步骤结果和屏幕截图。

查看过往运行记录时,请按以下工作流操作:

  1. 调用 momentic_list_runs 工具,确定需要进一步查看的运行记录。如果相关运行记录中有 gitBranchName,务必传入该参数。需要查看其他分支的运行记录时,则省略此参数。
  2. 调用 momentic_get_run,获取该次运行的详细信息。
  3. 调用 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 — 此次失败不属于其他任何类别。

评论

支持 Markdown