disable-model-invocation: true name: spec-test description: > 当角色 spec-tester 需要为 Spec 撰写 tester/test-plan.md、在实现完成后执行测试并产出 tester/test-report.md, 或在 spec-debugger 修复后重新验证时使用。若测试对象属于 Web 前端、端侧应用、API、CLI 等具体场景, 先选择对应 references 测试策略;不要用于普通代码实现或 bug 修复。
Spec Test
运行契约
进入核心原则前先对齐这张表。它把本 Skill 当成一个有边界的循环单元:明确读什么、能动什么、怎么算完成、什么时候停、什么时候交还给人。
| 项 | 本 Skill 的约定 |
|---|---|
| 输入 | explorer/exploration-report.md、writer/plan.md、executor/summary.md、命中的场景测试策略 |
| 权限 | 写 tester/test-plan.md / tester/test-report.md、采集 tester/artifacts/ 证据、可调整测试脚本/配置;不直接修复 bug、不改业务实现 |
| 验证 | 验收标准具体可判定、关键路径有可审计证据、证据由测试运行自动生成且已脱敏 |
| 停止 | 测试计划/报告定稿且通过用户确认即停止;修复循环受 Loop Budget 约束,触发 max_rounds 或 max_no_progress_rounds 时停止发起新一轮 handoff |
| 升级 | 发现 bug 时向 TeamLead 提交 handoff(不自行修复);修复循环触上限或证据无法采集时,交回 TeamLead 由用户决策 |
核心原则
- 两个阶段,两个产出:Spec 创建阶段 →
tester/test-plan.md;测试执行阶段 →tester/test-report.md - 不直接修复 bug:发现 bug 时向 TeamLead 提交 bug handoff,由 TeamLead 启动 spec-debugger
- 通过 TeamLead 与 spec-writer 协作:Spec 阶段需讨论接口边界和异常情况,确保测试覆盖完整
- 关键路径可观测:测试必须验证系统关键路径有日志、trace id、事件或其他可审计证据
- 证据归属 tester:端侧测试和关键路径测试的审计日志必须保存在当前 Spec 目录的
tester/artifacts/test-logs/<run-id>/ - 证据必须自动采集:
tester/artifacts/test-logs/<run-id>/下的日志、JSON、trace、录屏和截图必须由测试脚本、浏览器自动化、服务日志采集或命令输出生成;Agent 不得手写、补写或伪造这些证据文件内容 - 策略按场景加载:不同开发场景的测试策略沉淀在
references/,命中场景时先读取对应策略 - 策略在 spec-test 内沉淀:测试过程中发现跨项目可复用的测试方法时,更新本 Skill 的
references/和策略表;不要写入当前项目的AGENTS.md或.agents/rules/ - 修复循环受预算约束:重验属于 spec-tester ↔ spec-debugger 修复循环的一环,受
lead/team-context.md的Loop Budget约束。每轮重验后更新Loop Budget进展信号;触发max_rounds或max_no_progress_rounds时停止发起新一轮 handoff,转为通知 TeamLead 升级给用户。
测试策略库
根据当前 Spec 的技术栈和交付形态选择测试策略。只读取命中的策略文件,避免把无关测试细节塞进上下文。
| 场景 | 何时读取 | 策略文件 |
|---|---|---|
| Web 端侧 E2E | 涉及 Web 页面、用户路径、浏览器交互、前端控制台、网络请求、后端日志联动验证 | references/web-e2e-testing.md |
新增策略时放入 spec-test/references/<场景>-testing.md,并在上表补一行。策略文件只写长期可复用的测试方法,不写某个项目的一次性细节。
策略撰写标准
新增或修改 references/*-testing.md 时必须遵守:
- 文件命名:
<场景>-testing.md,英文小写短横线,如web-e2e-testing.md - 开头先写路由条件:第一节必须是
## 何时使用,说明什么时候读这个策略、什么时候不要读 - 必须给 test-plan 要求:明确该策略要求
tester/test-plan.md增补哪些章节、表格或字段 - 必须给执行流程:按可操作步骤描述如何执行测试,包含环境、数据、工具、日志和失败处理
- 必须给 test-report 要求:明确
tester/test-report.md中如何呈现证据、结论和失败信息 - 必须给证据与脱敏规则:说明证据保存路径、日志类型、截图/trace/录屏要求,以及不能保存的敏感信息
- 必须给证据生成规则:明确证据文件只能由测试运行自动生成,禁止 Agent 事后手写日志、JSON 或 trace
- 必须给常见陷阱:列出该场景最容易漏掉或误判的点
- 禁止写项目一次性细节:具体账号、真实 URL、业务私有数据、临时 workaround 不写入策略文件
推荐结构:
# 场景名测试策略
## 何时使用
## tester/test-plan.md 必须补充
## 执行流程
## tester/test-report.md 必须补充
## 证据与脱敏
## 常见陷阱
策略沉淀时机
策略沉淀发生在 spec-test 内部,不等到 Spec 收尾阶段。
在完成测试执行并产出 tester/test-report.md 后,必须做一次轻量判断:
| 判断问题 | 是 | 否 |
|---|---|---|
| 本次是否形成了某类开发场景可复用的测试方法? | 新增或更新 references/*-testing.md |
不沉淀 |
| 本次是否补齐了现有策略缺失的证据、日志、断言或失败处理要求? | 更新对应策略文件 | 只保留在 tester/test-report.md |
| 本次经验是否跨项目有效,而不是当前项目的一次性约束? | 可进入策略库 | 留在当前 Spec 文档或项目规则中 |
需要沉淀时:
- 先向用户说明拟新增或修改的策略文件
- 得到确认后编辑
spec-test/references/<场景>-testing.md - 如果是新增策略,同步更新上方「测试策略库」表格
- 只写长期可复用的测试方法,不写当前项目的账号、URL、业务私有规则或临时 workaround
阶段一:撰写测试计划(Spec 创建阶段)
步骤 1:读取探索报告
读取当前 Spec 目录下的 explorer/exploration-report.md,了解:
- 现有代码结构和接口
- 历史经验和已知的边界情况
- 外部依赖和限制条件
步骤 2:通过 TeamLead 与 spec-writer 协作讨论
通过 TeamLead 中转,与 spec-writer 讨论:
- 接口设计(参数类型、返回值、异常情况)
- 验收边界(何时算通过、何时算失败)
- 边界条件(空值、极端输入、并发场景)
- 关键路径日志点(状态流转、权限边界、数据写入、异步任务、外部 API、错误恢复)
- 端侧审计证据(控制台日志、网络摘要、截图/录屏、设备/浏览器/App 版本)
- 命中的场景测试策略(如 Web 端侧 E2E 的用户使用场景、浏览器自动化、前后端日志联动)
步骤 3:撰写 tester/test-plan.md
在当前 Spec 目录下创建 tester/test-plan.md:
---
title: 测试计划
type: test-plan
status: 未确认
created: YYYY-MM-DD
plan: "[[../writer/plan|plan]]"
tags:
- spec
- test-plan
---
必须包含的章节:
# 测试计划
## 验收标准
[通过/不通过的判定标准,要具体可衡量]
## 测试用例
| 用例编号 | 描述 | 输入 | 预期输出 | 边界条件 |
|---------|------|------|---------|---------|
| TC-001 | [描述] | [输入] | [预期] | [边界] |
## 用户使用场景(端侧/E2E 适用)
| 场景编号 | 用户角色 | 业务目标 | 操作路径 | 关键断言 | 证据 |
|---------|----------|----------|----------|----------|------|
| US-001 | [角色] | [目标] | [点击/输入/跳转路径] | [UI/数据/日志断言] | [截图/console/network/backend log] |
## 覆盖率要求
- 代码覆盖率:> 80%
- 功能覆盖率:[具体要求]
## 日志与审计要求
### 关键路径可观测性
- 必须验证以下关键路径是否留下可追溯证据:[列出状态流转/权限边界/数据写入/异步任务/外部 API/错误恢复]
- 每个关键路径至少保留一种证据:日志片段、trace id、事件记录、数据库审计字段或任务执行记录
- 日志断言应覆盖成功、失败和拒绝/回滚路径
### 端侧审计日志
- 端侧测试必须保留审计日志目录:`tester/artifacts/test-logs/YYYYMMDD-HHMM-run-XXX/`
- 审计日志至少包含:测试 run id、时间戳、测试账号/角色(脱敏)、设备/浏览器/App 版本、操作路径、控制台日志、网络请求摘要、截图或录屏路径、失败堆栈、关联用例编号
- 不得保存 token、密码、密钥、完整手机号、身份证号或真实用户隐私
## 测试环境要求
[依赖、配置、数据准备]
步骤 4:通知 TeamLead 完成
先更新当前 Spec 的 lead/team-context.md 共享区:
- 在
Task Progress中追加或更新 spec-tester 的测试计划任务行 status标记为doneartifact指向tester/test-plan.mdcompleted_at使用当前时间,updated_by写spec-tester- 只修改
Task Progress,不要修改 TeamLead 控制面区块
通知 TeamLead:tester/test-plan.md 已完成,等待用户确认。
阶段二:执行测试(测试执行阶段)
步骤 1:读取必要文档
writer/plan.md:了解设计方案tester/test-plan.md:测试用例和验收标准executor/summary.md:了解实现细节
步骤 2:执行测试用例
按 tester/test-plan.md 的用例逐一执行,记录结果。
每次测试运行先在当前 Spec 目录下创建 tester 审计日志目录:
tester/artifacts/test-logs/YYYYMMDD-HHMM-run-XXX/
├── audit.log
├── console.log
├── network-summary.json
├── screenshots/
├── recordings/
└── traces/
根据测试类型保留证据:
- 后端/系统关键路径:保留关键日志片段、trace id、任务 id、事件 id 或数据库审计字段
- Web 端测试:保留 console 日志、network 摘要、关键截图,必要时保留 trace/录屏
- Web 端侧 E2E:按 references/web-e2e-testing.md 执行用户场景、浏览器点击、前端控制台/网络请求/后端日志联动验证
- iOS/Android/桌面端测试:保留设备信息、App 版本、操作路径、截图/录屏、崩溃或失败堆栈
- 所有证据必须脱敏,禁止保存 token、密码、密钥和真实用户隐私
证据生成规则:
- 必须通过测试运行自动生成证据文件,例如测试脚本捕获 console/network、Playwright trace/screenshot、后端日志按 RUN_ID 过滤导出、CLI 命令输出重定向。
- 允许 Agent 编写或调整测试脚本、测试配置、日志采集命令,让测试执行时自动写入
tester/artifacts/test-logs/<run-id>/。 - 禁止 Agent 在测试结束后手工编辑
audit.log、console.log、browser-console.ndjson、network-summary.json、backend.log、traces/或recordings/来“补齐证据”。 - 如果某类证据无法自动采集,在
tester/test-report.md记录缺失原因和风险;不要用手写内容替代真实证据。
步骤 3:发现 Bug 时的处理
[!important] 不直接修复,向 TeamLead 提交 bug handoff
先更新当前 Spec 的 lead/team-context.md 共享区:
- 在
Problem Resolution Log中追加或更新该问题行 found_by写spec-testerowner建议写spec-debuggerproblem简述现象,artifacts引用测试证据路径或即将创建的 debug 文档status标记为openupdated_by写spec-tester- 只修改
Problem Resolution Log,不要修改 TeamLead 控制面区块
通知 TeamLead:
- 现象:[错误描述]
- 复现步骤:[步骤]
- 预期:[期望行为]
- 实际:[实际行为]
- 相关测试用例:TC-XXX
- 建议下游角色:spec-debugger
等待 TeamLead 提供 spec-debugger 的修复完成通知后,重新执行相关测试用例。
重验后更新修复循环记账
收到 spec-debugger 的修复完成通知并重新执行相关用例后,更新 lead/team-context.md 的 Loop Budget(test-debug 行):
- 验证通过:把
status标为passed,在Problem Resolution Log把对应问题行标为verified,结束修复循环。 - 仍然失败:与 spec-debugger 的本轮记账保持一致,复核
rounds_used和no_progress_streak是否已正确递增(重验视角下,本轮是否新增通过用例、是否缩小失败范围)。- 若
rounds_used达到max_rounds或no_progress_streak达到max_no_progress_rounds,把status标为stopped-budget或stopped-no-progress,不再发起下一轮 bug handoff,转而通知 TeamLead 升级给用户。 - 若预算未触上限,再向 TeamLead 提交下一轮 bug handoff。
- 若
通知 TeamLead(触发预算上限时):修复循环已达预算上限,停止重验并请升级给用户。
- 已用轮数:{rounds_used}/{max_rounds}
- 连续无进展轮数:{no_progress_streak}/{max_no_progress_rounds}
- 仍未通过的用例:TC-XXX
- 建议用户在「继续加预算 / 改方案 / 暂停」中决定下一步
步骤 4:记录微小修改
测试过程中如有微小调整(非 bug,如参数调优、配置修正):
- 直接记录到
tester/test-report.md的「修改记录」表 - 不创建 debug 文档
步骤 5:产出 tester/test-report.md
在当前 Spec 目录下创建 tester/test-report.md:
---
title: 测试报告
type: test-report
status: 未确认
created: YYYY-MM-DD
plan: "[[../writer/plan|plan]]"
test-plan: "[[test-plan|test-plan]]"
tags:
- spec
- test-report
---
必须包含的章节:
# 测试报告
## 测试概况
- 测试用例总数:X
- 通过:X
- 失败:X(已修复:X)
- 代码覆盖率:X%
## 测试过程中的修改记录
| 修改类型 | 描述 | 关联文档 |
|---------|------|---------|
| 微小调整 | [直接描述] | — |
| Bug 修复 | [问题现象简述] | [[../debugger/debug-001\|debug-001]] |
## 日志与审计证据
### 测试运行
- Run ID: YYYYMMDD-HHMM-run-XXX
- 审计日志目录: `tester/artifacts/test-logs/YYYYMMDD-HHMM-run-XXX/`
- 测试账号/角色: [脱敏后的账号或角色]
- 设备/浏览器/App 版本: [端侧测试必填]
### 关键路径日志验证
| 关键路径 | 关联用例 | 证据类型 | 证据位置/trace id | 结果 |
|---------|---------|---------|------------------|------|
| [状态流转/权限边界/数据写入等] | TC-XXX | 日志/trace/事件/截图 | `tester/artifacts/test-logs/...` 或 trace id | 通过/失败 |
### 端侧审计留存
- 控制台日志: `tester/artifacts/test-logs/YYYYMMDD-HHMM-run-XXX/console.log`
- 网络摘要: `tester/artifacts/test-logs/YYYYMMDD-HHMM-run-XXX/network-summary.json`
- 截图: `tester/artifacts/test-logs/YYYYMMDD-HHMM-run-XXX/screenshots/`
- 录屏/trace(如有): `tester/artifacts/test-logs/YYYYMMDD-HHMM-run-XXX/recordings/` / `traces/`
- 脱敏检查: 已确认未保存 token、密码、密钥或真实用户隐私
## 发现的 Bug(如有)
- [[../debugger/debug-001|Bug 标题]] - 已修复 ✅
## 最终测试结果
[通过/不通过,结论]
## 文档关联
- 设计文档: [[../writer/plan|设计方案]]
- 测试计划: [[test-plan|测试计划]]
步骤 6:测试策略沉淀判断
基于本次 tester/test-plan.md、tester/test-report.md 和测试日志,判断是否需要沉淀或更新测试策略:
- 是否出现了新的可复用测试场景(如移动端真机、API 契约、异步任务、权限矩阵、性能回归)
- 是否发现现有策略漏掉了关键证据(如 console/network/backend log、trace、截图、录屏、审计字段)
- 是否形成了跨项目都适用的执行步骤、断言方式、失败处理或脱敏规则
如果需要沉淀:
- 暂停通知 TeamLead,先向用户说明拟修改
spec-test/references/的内容 - 用户确认后,按「策略撰写标准」新增或更新策略文件
- 如新增策略,同步更新「测试策略库」表格
- 在
tester/test-report.md的「文档关联」中补充策略文件引用
如果不需要沉淀,在 tester/test-report.md 中记录:
## 测试策略沉淀判断
- 结论:无需新增或更新通用测试策略
- 原因:[本次仅为项目特定验证 / 已被现有策略覆盖 / 无跨项目复用价值]
步骤 7:通知 TeamLead 完成
先更新当前 Spec 的 lead/team-context.md 共享区:
- 在
Task Progress中追加或更新 spec-tester 的测试执行任务行 status标记为done或blocked(如仍有未解决问题)artifact指向tester/test-report.mdcompleted_at使用当前时间,updated_by写spec-tester- 若测试过程中发现的问题已验证修复,在
Problem Resolution Log中把对应行状态更新为verified - 只修改
Task Progress/Problem Resolution Log,不要修改 TeamLead 控制面区块
通知 TeamLead:tester/test-report.md 已完成,等待用户确认。
与其他角色的协作
阶段二:spec-explorer → (explorer/exploration-report.md) → spec-tester
spec-writer ↔ TeamLead ↔ spec-tester(接口讨论)
阶段四:spec-executor → (executor/summary.md) → spec-tester 执行测试
spec-tester ↔ TeamLead ↔ spec-debugger(bug 修复闭环)
发现 bug → 向 TeamLead 提交 bug handoff
修复完成 → TeamLead 通知 spec-tester 重新验证
后续动作
阶段一完成后确认:
tester/test-plan.md已在正确路径创建- 已与 spec-writer 讨论并对齐接口边界
- 已更新
lead/team-context.md的Task Progress中测试计划任务行 - 已通知 TeamLead
阶段二完成后确认:
tester/test-report.md已创建,包含所有测试结果- 所有发现的 bug 都已由 spec-debugger 修复并重新验证
- 关键路径日志验证已记录到
tester/test-report.md - 端侧测试审计日志已保存到当前 Spec 目录的
tester/artifacts/test-logs/<run-id>/ - 已完成脱敏检查,未保存 token、密码、密钥或真实用户隐私
- 已完成测试策略沉淀判断;如需新增或更新策略,已获得用户确认并维护
references/和策略表 - 已更新
lead/team-context.md的Task Progress和必要的Problem Resolution Log - 已通知 TeamLead
常见陷阱
- 直接修复 bug 或绕过 TeamLead 联系 spec-debugger(破坏协作闭环)
tester/test-plan.md验收标准不够具体(无法判断通过/失败)- 忘记在
tester/test-report.md中引用 debug 文档 - 端侧测试只看界面结果,没有保存 console/network/截图等审计证据
- 关键路径没有日志或 trace id,导致失败后无法复盘
- 审计日志包含未脱敏的 token、密码、密钥或真实用户隐私
- 把可复用测试策略只写在
tester/test-report.md,没有沉淀到spec-test/references/ - 修复循环重验后忘记更新
Loop Budget,或在触发预算上限后仍发起新一轮 bug handoff(应停止并升级给 TeamLead)