关于 evidence-driven-testing
用于记录并交付测试证据的技能。它根据改动类型指导 Agent 使用实时界面录制、脚本捕获或 CLI/API 输出对。
主要功能
- 01按改动类型选择证据
- 02带注释的实时屏幕录制
- 03跨平台录制工具
- 04无界面捕获指南
- 05生成报告与清单
适用场景
- 01记录交互式 UI 测试结果
- 02验证 CLI 或 API 改动
- 03检查文档及可运行示例
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ michaelshimeles/ rstack --skill evidence-driven-testing安装后在 Claude Code 中输入/evidence-driven-testing确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
scripts/run-playwright.shevidence.pyscripts/playwright/package.jsonpackage-lock.json详细介绍
基于证据的测试
记录行为证明,并将其交付到指定位置。
选择与变更相称的证据。交互式流程使用录制工具,无头 UI 检查使用脚本捕获,CLI 或 API 变更使用输出对。仅涉及文档的编辑需要检查内容并验证可运行示例,无需录制。复用任务中已捕获的合适证据。仅发布到请求范围内的目标位置。
录制内容是你通过计算机操作测试应用的过程:启动录制工具,然后亲自操作应用——点击、输入、导航——逐一测试每个目标。视频中的每个操作都是实时进行的测试;除非录制内容展示了这段交互会话,否则它不能作为有效证据。如果测试框架没有计算机操作工具,但存在 GUI,则改用 cua-driver 操作应用(见下文)——这仍然是你的实时会话。
捆绑的录制工具 scripts/evidence.py 使用 FFmpeg 在 Linux、macOS 和 Windows 上捕获显示画面,为测试过程中添加的每条注释标记时间戳,在停止时将其嵌入视频,并使用 ffprobe 验证结果。它会将 evidence.mp4、report.md 和 manifest.json 写入会话文件夹。
输入
- 测试目标(必填):需要验证的行为/流程,以可测试的陈述形式表述。
- PR/问题(可选):证据的发布位置。如果省略,则仅交付给请求者。
录制器
下文中的 EVIDENCE 表示此技能文件夹中的 scripts/evidence.py 路径(无论技能安装在哪里,例如
~/.claude/skills/evidence-driven-testing/scripts/evidence.py)。只需要 Python 3 和 FFmpeg。
-
先检查:
python3 $EVIDENCE doctor— 检查ffmpeg、ffprobe、libx264和ass滤镜是否可用(ready),然后确认这台机器上哪种屏幕捕获源可用(capture_ready,以及auto会选择的源)。 只有在缺少工具链时才会以非零状态退出;录制前请先查看capture_ready。 -
平台(
--source auto会选择第一个可用源):OS 源 要求 Linux X11 / XWayland x11(x11grab)设置了 DISPLAYLinux Wayland wayland(wf-recorder)设置了 WAYLAND_DISPLAY,wf-recorder位于 PATH 中,且已确认合成器支持 wlr-screencopy — 可以是已知的 wlroots 合成器(Sway、Hyprland、river、Wayfire、labwc、dwl、niri),也可以通过wayland-info验证。GNOME 和 KDE Wayland 无法通过此方式捕获;doctor会说明原因。对于 X11 应用,可通过 XWayland 使用x11;也可使用备用录制器。--source wayland仍会强制使用该源macOS avfoundation已授予终端 / Agent 宿主应用屏幕录制权限; doctor会列出供--screen-index使用的屏幕索引Windows gdigrab任意标准 ffmpeg 构建;使用 powershell检查进程默认捕获整个屏幕;
--geometry WxH和--offset X,Y可在 x11、wayland 和 gdigrab 上裁剪区域。XWayland 只能看到 X11 窗口,因此对于 Wayland 原生应用,优先使用wayland源。 -
崩溃安全的原始捕获:原始录制采用 MPEG-TS(
raw.ts),因此即使录制器被强制终止或发生崩溃,已捕获的内容仍可探测和渲染。stop会将其重新封装或重新编码为标准的evidence.mp4。 -
停止方式:在 Linux 上,通过 pidfd 向录制器发送信号。 在 macOS 和 Windows 上,以及 Linux 内核或 seccomp 策略拒绝 pidfd 时,
start会启动一个小型监督进程来管理 ffmpeg 子进程;stop会通过会话文件夹中的stop.request请求该进程依次中断、终止,然后强制结束;完成后会写入recorder-exit.json。整个过程绝不会向裸 PID 发送信号,因此不会误伤被复用的 PID。如果监督进程在录制器仍运行时退出,stop会拒绝操作,并告知需要手动停止的 PID。如果它在记录已启动的进程信息前就退出,stop会保持阻塞,直到你自行检查是否有残留录制器,并使用--accept-untracked-recorder重新运行;随后报告会注明这一限制。 -
如果
doctor未检测到可用的捕获源(例如 Wayland 环境中没有 wf-recorder),可使用备用录制器:cua-driver recording start <dir>/stop(参见 cua-driver 部分),或操作系统自带的录制器(macOS:screencapture -v out.mov)。这些方式没有注释叠加层,因此请将注释协议保留为文件 — 创建一个assertions.md,列出每个setup/test_start/assertion及其结果和大致的视频时间戳,与无头模式完全一致。 -
绝不将
--source test(合成图案生成器)作为 UI 证据。它用于冒烟测试工具链;仓库中的tests/test_evidence.py会对其进行测试。
说明
1. 准备屏幕
- 将浏览器 / 应用窗口最大化;关闭弹出窗口、通知和多余面板。
- 导航到起始状态(已登录、打开正确页面),然后再开始录制;除非测试内容本身就是设置过程。
- 记录正在测试的确切修订版本:
git rev-parse HEAD和git branch --show-current(或部署 URL)— 录制器会将它们写入报告。
2. 开始录制
-
在第一个有意义的操作前开始屏幕录制:
python3 $EVIDENCE start \ --output .artifacts/<task-name> \ --title "<what is being verified>" \ --commit "$(git rev-parse HEAD)" --branch "$(git branch --show-current)" \ --environment "<OS / browser / display / deployment>"它会输出包含
session路径和所选source的 JSON;后续每条命令都要保留该路径(SESSION=...)。系统会自动检测来源并录制整个屏幕;仅在doctor提示需要或实际情况要求时,才传入--source、--geometry、--offset、--display/--xauthority(X11)、--screen-index(macOS)或--output-name(Wayland)。 -
添加一条
setup注释,描述初始上下文:python3 $EVIDENCE annotate "$SESSION" --type setup \ --message "Logged in, navigating to connectors page"
3. 通过计算机操作进行测试,并随时添加注释
-
在运行中的应用中,通过计算机操作完成每次交互——录制会捕获整个会话,因此测试和证据是同一过程。操作节奏要便于观看:每次操作后等待 UI 稳定下来,让状态变化在视频中清晰可见。
-
每个具名测试开始时,按照 Jest 风格添加一条
test_start注释:python3 $EVIDENCE annotate "$SESSION" --type test_start \ --message "It should execute the tool directly when permission is 'always'" -
每项检查后,添加一条
assertion注释,并使用--result passed、failed或untested:python3 $EVIDENCE annotate "$SESSION" --type assertion --result passed \ --message "Tool ran without a permission prompt" -
断言规则:
- 每次有意义的状态变化对应一条断言——合并记录,不要针对每个 UI 标签分别添加注释。
- 使用“Precondition: ...”断言来确认初始状态。
- 字符数控制在 80 以内,并突出关键信息(录制器会拒绝过长的消息)。
- 如果测试无法运行(缺少前置条件、身份验证窗口已过期),请标记为
untested并说明原因——绝不可悄悄跳过。 - 时间戳记录的是作出断言的时间,而非断言是否为真——选择
passed前先查看屏幕。
4. 停止并检查
-
在最后一条断言之后停止录制:
python3 $EVIDENCE stop "$SESSION"这会停止录制(以正常方式停止,让录制器完成写入;仅在它无视停止请求时才升级处理),将注释写入
evidence.mp4,检查结果,并在同一目录下生成report.md和manifest.json。成功时会输出"verified": true;如果渲染失败,会将会话标记为finalization_failed——修复报告中的原因后再次运行stop(重试不会重复向录制器发送信号)。如果无法安全地向录制器进程发送信号(进程已退出,或其 PID 现在属于其他进程),会话会被标记为recorder_lost。再次运行stop会完成已录制视频的最终处理,但前提是已确认录制器进程终止——如果进程仍在运行,请先停止它,否则视频会在仍处于写入状态时被渲染。 -
分享前,确认录制内容包含关键时刻:在每条断言的时间戳处提取一帧(
ffmpeg -ss <t> -i evidence.mp4 -frames:v 1 frame.png),并检查状态和标签是否清晰可见。 -
填写
report.md的 Caveats 部分;绝不可保留占位文本。
5. 发布证据
report.md是测试报告,内容包括测试项目、环境和准确的提交版本、每项测试的通过/失败情况以及注意事项。请在其基础上扩展,而非从头重写。- 将视频和摘要作为 PR 评论发布(如果这是你创建的 PR,也可以嵌入 PR 描述中)。
gh pr comment无法附加本地视频——请通过已登录的浏览器,在 PR 评论框中上传evidence.mp4,或将其上传到托管平台并附上链接(例如before-and-after上传适配器)。重新打开评论,确认视频能够播放后,再声称已发布。 - 如果任务包含跟踪问题,且已获准在该问题下发布,请附上同一视频,并用一句话说明结果。
- 将报告和录制内容发送给请求者。
防护措施
- 视频必须展示实际测试会话的实时操作。绝不能将脚本回放、拼接片段或合成画面伪装成录制内容;如果测试框架没有计算机操作工具但存在 GUI,请通过
cua-driver操作;如果完全没有 GUI,则改用无头模式。 - 绝不能录制半遮挡或平铺的窗口——先最大化窗口。
- 绝不能录制显示机密、令牌、客户数据或付款详情的屏幕;如果流程需要这些信息,请将其标记为
untested并说明原因。 - 验证修复时,应同时展示或引用修复前的失败情况和修复后的成功情况。
- 始终说明测试所针对的确切提交、分支或部署。
没有计算机操作工具?使用 cua-driver 操作(有 GUI 时)
如果存在显示器,但 Agent 没有内置的计算机操作能力,请使用 cua-driver(macOS / Windows / Linux)作为操作工具。仍然是你在实时测试应用——录制规则保持不变,只有输入方式不同。
- 录制前,先使用
cua-driver doctor验证设置。如果已安装cua-driver技能,请阅读并遵循其协议——操作前先快照这一要求不可违反。 - 每次交互都遵循以下循环:
launch_app→get_window_state(无障碍树 + 屏幕截图)→ 通过element_token执行操作(click、type_text、press_key)→ 使用verify_state验证预期的后置条件。每项verify_state检查都与一条assertion注释一一对应。 - 只要
doctor报告capture_ready: yes,就继续使用上文提供的捆绑录制器录制视频并添加注释;cua-driver 仅负责提供输入。 - 否则,使用
cua-driver recording start <output-dir>/cua-driver recording stop进行录制(必须指定输出目录,且守护进程必须正在运行:cua-driver serve)。默认启用视频捕获,停止时会将视频写入<output-dir>/recording.mp4;但在 Windows/Linux 上,这会调用 ffmpeg,因此如果缺少 ffmpeg 或显示器,将只生成逐轮轨迹文件夹(操作前/后的屏幕截图、action.json、click.png),不会生成视频。停止后,确认recording.mp4存在,再引用它;如果文件不存在,请修复录制器,或按照无头模式协议,将逐轮操作前/后的屏幕截图作为编号捕获结果提交。 - 如果此方式不提供注释叠加层,请将协议记录为文件:创建
assertions.md,逐项列出每个test_start/assertion及其结果,格式与无头模式完全一致。
无图形界面的无头模式
如果 Agent 没有桌面环境可供录制,请保持相同的断言规范; 将录制工具替换为脚本化采集:
-
将所有内容保存到
.artifacts/<task-name>/(将其加入 gitignore — 证据会上传,绝不提交)。将采集脚本与采集结果放在一起,以便重复运行。 -
截图:
before-and-afterCLI(@vercel/before-and-after)可采集 URL 或元素,其截图对可直接用于 PR 嵌入。在 Chrome 因“No usable sandbox”而无法运行的容器/VM 中,设置AGENT_BROWSER_ARGS="--no-sandbox"。 -
视频 / 多步骤流程:编写一次性 Playwright 脚本,运行时无需将 playwright 添加到项目依赖中:
bash /path/to/evidence-driven-testing/scripts/run-playwright.sh record.mjs此辅助工具会使用随附的清单和锁文件,在临时目录中通过
npm ci安装固定版本的 Playwright,将脚本复制到该安装目录旁边,并在需要时安装 Chromium,然后在退出时删除临时目录。它会保留调用方的工作目录,因此相对产物路径仍指向项目目录。需要 Node 20+ 和 npm;浏览器缓存会保留,供后续运行使用。脚本应保持自包含:相对导入和相邻数据文件不会被复制。对于包含本地导入的脚本,请使用项目现有的 Playwright 配置。升级采集工具时,请更新scripts/playwright/package.json,使用 npm 重新生成其锁文件,并重新运行采集检查。npx --package=playwright会将可执行文件添加到 PATH;但这不会让任意 ESM 脚本都能导入该包。最简record.mjs:import { chromium } from "playwright"; const browser = await chromium.launch(); try { const context = await browser.newContext({ recordVideo: { dir: ".artifacts/<task-name>/" }, }); try { const page = await context.newPage(); await page.goto("http://localhost:3000/path-under-test"); // Drive the flow and check each expected state here. } finally { await context.close(); // Finalizes the video even if an assertion fails. } } finally { await browser.close(); }如果文件较大,请使用 ffmpeg 裁剪或压缩。
-
将注释协议改为文件:按测试顺序为采集内容编号,并在文件名中写明断言 —
01-precondition-signed-in.png、02-it-saves-on-blur-passed.png— 同时在产物文件夹中保留assertions.md,列出每项test_start/assertion及其结果(passed/failed/untested+ 原因)。
非 UI 改动仍需提供证据
- API / 性能:使用脚本探测并记录测量数据 — 各阶段的请求数、前后延迟 — 保存到
probe-output.txt。 - 渲染 / 画布 / 着色器:提供渲染帧和像素断言(差异值),人工检查后保存为 PNG。
- Agent 行为:提供展示工具调用及响应的相关对话记录摘录。
- Bug 修复:编写修复前先复现并采集故障,作为前后对比中的“修复前”部分。
采集规范
- 确认正在探测的服务运行的是你自己的代码(端口正确、进程正确),尤其是在多名 Agent 共用一台机器时:
lsof -i :<port>— 如果未安装lsof,则运行ss -ltnp "sport = :<port>"查找监听进程的 PID,然后运行ps -p <pid> -o args=确认进程属于你。 - 证据是对仓库检查(类型检查/构建/测试)的补充,绝不能替代它们。
- 将前后媒体对交给前后对比工具,用于 PR 嵌入(例如
before-and-after before.png after.png --markdown)。