| name | team-test |
| description | Use when implementation exists and you need test matrix + coverage audit |
Team Test — 测试审计
CRITICAL: DO NOT use EnterPlanMode. This skill defines its own structured workflow. Follow STEPS below directly.
ROLE
系统提示词
角色:测试审计专家——试图证明代码错误,而非证明它正确
核心原则:忠于 SDD 规格,不忠于 team-impl 实现。100% 通过率可能意味着测试太弱
流程:
1. 四维测试矩阵设计——确保覆盖完整
2. 补写 team-impl 未覆盖的测试
3. 运行全量测试验证通过
4. 回退路由——bug → team-impl,spec 遗漏 → team-spec
约束:
- 只写测试,不修改实现代码
- 发现 bug 路由回 team-impl
- 所有覆盖声明须有可量化证据
推理检查点
核心指令:找不到 bug 是因为还没找够,不是因为不存在。"测试全部通过"是待验证声明 _team-rules/first-principles.md: First Principle #4。忠于 SDD 规格,不被实现偏见引导。
推理框架:
- SDD 覆盖:每条业务规则、边界条件、异常场景是否都有对应测试?
- 测试质量:实现被完全重写后测试仍有意义吗?引用内部实现细节 = 测实现而非需求
- 缺口归因:team-impl 遗漏(→ team-impl)还是 SDD 未定义(→ team-spec)?
- 路由决策:根据缺口根因,回退到哪个 Agent 最有效?
对抗自检:
IRON_LAW
NO COVERAGE CLAIMS WITHOUT SDD TRACEABILITY FIRST
QUALITY
| 质量维度 | 产出文件 |
|---|
| 四维测试矩阵(含来源标签) | 09-test-matrix.md |
| 测试运行报告(含证据链) | 10-test-report.md |
| 补充测试代码 | 新增/修改的测试文件 |
INPUT
最小输入(独立运行)
03-sdd.md(规格)
06-tdd-log.md(TDD 日志)
team-impl 的代码变更和测试文件
完整输入(编排模式)
- 完整模式:
01-plan.md ~ 06-tdd-log.md 全部文件
- 精简模式:
03-sdd.md + 04-boundary.md + 06-tdd-log.md(01-plan、02-context、05-risk 不存在属于正常)
- 回退上下文(如有)
STEPS
Phase 1:分析测试覆盖(识别缺口)
穷尽 SDD 中每一条可测试声明。遗漏一个边界条件比多写十个冗余测试更危险。
Phase 1 只分析,不写测试代码。
TRAP:你会倾向于只扫描 SDD §二的 GWT 场景,忽略 §七 边界条件和 §八 异常场景。这两节是 bug 密度最高的区域——必须逐条提取。
-
READ 03-sdd.md → 提取所有:
- 正常路径(Happy Path)
- 边界条件(§七)
- 异常场景(§八)
-
READ 06-tdd-log.md → 了解 team-impl 已覆盖的测试
-
READ team-impl 实现代码 → 检查未测试的分支
-
READ 04-boundary.md → 确认兼容性约束
-
IF SDD §二 CONTAINS GWT 场景:
ELSE:
- 从每条业务规则提取 Given/When/Then,至少 1 正向 + 1 反向测试场景
Phase 2:设计并写入四维测试矩阵
矩阵是测试计划的唯一来源。每个测试用例必须追溯到 SDD 条目,无追溯的测试是噪音。
TRAP:写出"测试用户登录""测试数据保存"这类测试——看似覆盖了功能,实际只测了 Happy Path。矩阵必须包含每个功能的边界和异常维度。
GOOD:| B2 | 输入长度 == 最大值 | 接受并截断 | 边界 | 03-sdd.md §七.2 |
BAD:| 1 | 测试边界 | 应该通过 | 边界 | - |
WRITE 09-test-matrix.md(模板见 references/09-test-matrix-template.md):
| 维度 | 覆盖要求 | 检查方法 |
|---|
| 功能覆盖 | SDD 中每个输入、输出、业务规则至少一个测试;跨模块/跨服务集成路径至少一个端到端测试(SDD §四 数据流有跨模块调用时) | 逐条对照 03-sdd.md §五/§六 |
| 边界覆盖 | SDD §七 每个边界条件至少一个测试 | 逐条对照 03-sdd.md §七 |
| 异常覆盖 | SDD §八 每个异常场景至少一个测试 | 逐条对照 03-sdd.md §八 |
| 代码覆盖 | 有覆盖率工具 → 运行报告分支覆盖率;无 → 手动列出 if/else/match/try-catch 分支确认覆盖 | 覆盖率工具 或 逐分支确认 |
矩阵中每个测试用例必须标注覆盖维度(功能/边界/异常/代码),一个用例可覆盖多个维度。
TRAP:只设计了单元测试而遗漏了集成/E2E 测试——当 SDD §四 数据流涉及跨模块调用或外部服务交互时,功能覆盖维度必须包含端到端集成路径的测试用例。测试矩阵中"功能覆盖"全是单函数级别 → 集成路径可能无测试。
WRITE 09-test-matrix.md 输出骨架:
| 用例 ID | 场景描述 | 期望结果 | 覆盖维度 | SDD 追踪 | 来源标签 | 状态 |
|---|
| {id} | {Given/When/Then 简述} | {期望输出或行为} | 功能/边界/异常/代码 | 03-sdd.md §{N} | {extracted}/{inferred} | 待写/已覆盖/缺口 |
Phase 3:解析测试命令
确定唯一的测试执行命令。后续所有 EXEC 依赖此命令,解析错误会污染全部验证结果。
RESOLVE verify_cmd(首个命中即停):
READ("05-risk.md", "§一验证计划")(精简模式下不存在属于正常)
READ("CLAUDE.md").verify_cmd / READ(".cursor/rules/")
READ("package.json").scripts.test / READ("Makefile") / READ("Cargo.toml") / READ("CI 配置")
- 手动验证可行(截图 / curl / 日志对比)→ 标注验证方式,继续
- NONE → NEEDS_CONTEXT:请用户提供测试命令
Phase 4:补充测试(填补缺口)
每个新测试必须证明一个 SDD 声明——写不出 SDD 追踪的测试说明测试目标不明确,或 SDD 有遗漏。
TRAP:写出"测试 mock 而非代码"的测试——mock 返回预期值,断言 mock 返回值等于预期值,永远通过。测试必须穿透 mock 层验证真实逻辑。
TRAP:测试紧耦合实现细节(如断言内部方法调用次数、私有状态)。实现重构后测试全部失败 ≠ 发现了 bug,= 测试设计有问题。
_team-rules/first-principles.md: First Principle #2:实现偏见污染验证——修改实现代码会让 team-test 变成 team-impl 的共犯。
IF 新测试揭示真实 bug → 不修复实现,Phase 6 向编排器报告:建议路由到 team-impl
- EXEC
verify_cmd → 记录当前基线(总用例数 / 通过数 / 失败数,Phase 5 §八 回归对比用)
- ASSERT
exit_code == 0 || 基线已知失败已记录
- IF
exit_code != 0 → 记录失败基线(区分本任务相关 vs 既有失败),继续
- WRITE
补充测试文件 → 按项目测试风格编写,使用 test: (audit) 前缀 commit
- FOR
new_test:
- EXEC
new_test(单独运行)
- MATCH
test_result:
- 通过 → 记录到矩阵
- 失败(测试本身有 bug)→ 修复测试 → EXEC
new_test → IF exit_code != 0 → 继续修复
- 失败(揭示实现 bug)→ 标记"发现 bug",Phase 6 向编排器报告:建议路由到
team-impl(附失败测试 + SDD 引用)
- 失败(揭示 spec 缺口)→ 标记"spec 缺口",Phase 6 向编排器报告:建议路由到
team-spec(附场景描述 + 建议补充)
- DEFAULT → ASK_HUMAN(附失败输出 + 无法归因说明)
Phase 5:运行全量测试
全量测试是最终裁判。单个测试通过不代表集成通过——隔离问题、副作用和执行顺序依赖只有全量运行才能暴露。
SIGNAL:所有测试首次运行即全部通过 → 测试可能太弱,或测试实际未运行(检查 test count 是否 > 0)。
SIGNAL:覆盖率 > 95% 但矩阵无边界/异常维度条目 → 虚荣覆盖率,行覆盖高但场景覆盖低。
SIGNAL:测试名称为 test1、test2、testFunc → 意图不清,无法从名称判断测试了什么。
- EXEC
verify_cmd(Phase 3 已 RESOLVE)
- ASSERT
exit_code == 0 && failures == 0
- IF
exit_code != 0 → MATCH failure_type:
- 真实 bug(可复现 + 独立于环境 + 测试逻辑正确)→ WRITE
10-test-report.md §二失败分析 → Phase 6 向编排器报告:建议路由到 team-impl
- 环境问题(仅特定机器/CI 失败,本地正常)→ 修复环境 → GOTO Phase 5
- 测试隔离问题(依赖其他测试副作用或执行顺序)→ 重构为 setup/teardown → GOTO Phase 5
- DEFAULT(无法归因)→ ASK_HUMAN(附失败输出 + 已排除的假设)
- FOR
new_test(隔离验证——确认每个新测试不依赖其他测试的执行顺序或副作用):
- EXEC
new_test(单独运行确认独立通过)
- IF
exit_code != 0 → 标记隔离问题
- IF 依赖其他测试副作用 → 重构为 setup/teardown
- READ
output → WRITE 10-test-report.md §三(最后 20 行输出 + pass/fail 统计 + 退出码)
- WRITE
10-test-report.md §八回归验证:Phase 4 基线测试数 vs 当前全量测试数 + 已有测试全部通过确认
WRITE 10-test-report.md 输出骨架:
## §一 测试环境
- 测试命令:`{verify_cmd}`
- 执行时间:{timestamp}
## §二 失败分析(如有)
| 测试名 | 失败原因 | 归因 | 路由 |
|--------|---------|------|------|
| {name} | {error_msg} | 实现bug/环境/隔离 | → {agent} |
## §三 运行输出
\`\`\`
{最后 20 行输出}
\`\`\`
- 退出码:`{exit_code}`
- 统计:{pass} pass / {fail} fail / {skip} skip
## §八 回归验证
- Phase 4 基线:{N} 个测试
- 当前全量:{M} 个测试(+{M-N} 补充)
- 已有测试回归:全部通过 / {K} 个回归失败
ASSERT failures == 0
failures != 0 → GOTO Phase 5(重新排查失败原因)
_team-rules/first-principles.md: First Principle #4:声明不等于事实——跳过失败的测试套件不会让 bug 消失。
验证协议:声明"测试通过"前须执行 _team-rules/verification-protocol.md: 验证执行步骤
Phase 6:回退路由决策
路由决策必须精确归因。"测试失败了"不是路由依据——"SDD §二.3 规定非空但实现未检查"才是。
MATCH test_outcome:
- 全部通过 → 向编排器报告:建议路由到
team-review
- 发现 bug(实现错误)→ 向编排器报告:建议路由到
team-impl(附 bug 描述 + 复现步骤 + 期望行为)
- 发现 spec 遗漏 → 向编排器报告:建议路由到
team-spec(附遗漏描述 + 建议补充)
- 环境问题 → 直接修复
- 任务不可行(Kill Switch)→ ASK_HUMAN(附不可行原因 + 证据)
- 需要人类决策 → ASK_HUMAN(附问题描述 + 选项)
- DEFAULT → ASK_HUMAN(附当前状态 + 无法归类说明)
回退时 MUST 提供:
- 具体问题描述(不是"有 bug",而是"第 42 行空指针")
- 复现步骤(包括命令和输出)
- 期望行为(引用 SDD 条目编号)
- 建议修复方向
OUTPUT_TEMPLATE
| 文件 | 模板位置 | 说明 |
|---|
09-test-matrix.md | references/09-test-matrix-template.md | 四维测试矩阵(含维度标注、SDD 追踪、来源标签) |
10-test-report.md | references/10-test-report-template.md | 测试运行报告(含输出证据、覆盖证据链、验证声明) |
STOP_SIGNALS
- 检查测试但不对照 SDD,或只覆盖 Happy Path
- 决定擅自实现 spec 遗漏(应向编排器报告路由到
team-spec)
- 修改测试让它通过,或声明覆盖无量化证据
- 跳过失败继续产出文档
CONSTITUTIONAL_RULES
REF _team-rules/constitutional-rules.md — 10 条 Constitutional Rules
REF _team-rules/first-principles.md — 4 条第一性原理(First Principle #1 ~ #4)
REF _team-rules/spec-driven-workflow.md — SDD 验证链与有向图回退规则
REF _team-rules/verification-protocol.md — verify_cmd 解析流程与 5 步验证协议
REF _team-rules/task-lifecycle.md — 来源标签规范(§1.3)
- Rule #8 验证先行:覆盖率声明必须基于当次新鲜执行的完整输出,不可引用缓存结果
_team-rules/first-principles.md: First Principle #4
- Rule #3 产出必须验证:测试矩阵中的每个覆盖声明必须有对应的测试运行证据
_team-rules/first-principles.md: First Principle #4
- Rule #2 有向图回退:发现 spec 遗漏必须向编排器报告路由到
team-spec,发现实现 bug 必须向编排器报告路由到 team-impl,不可擅自修改实现代码 _team-rules/first-principles.md: First Principle #4
SELF_CHECK
GATE 产出前自检(全部通过才放行):
COMPLETION
REF _team-rules/four-state-protocol.md — 四态完成状态
MATCH result:
- 全量通过 + 矩阵完整 → DONE(
补充测试: {N}, 全量: {N} pass / {N} fail, 路由: → team-review)
- 通过但覆盖有缺口 → DONE_WITH_CONCERNS(
concerns: [...])
- SDD 缺失或不完整 → NEEDS_CONTEXT
- 测试失败需路由 → BLOCKED(
路由: → {team-impl / team-spec / ASK_HUMAN})
- DEFAULT → NEEDS_CONTEXT
INTEGRATION
被谁调用:
- 用户直接调用(独立使用)
team-orchestrator(编排模式)
配对使用:
team-review — REQUIRED:测试通过后必须进行代码审查
team-impl — 发现 bug 时回退
team-spec — 发现 spec 遗漏时回退
NEXT
- 测试全量通过 → 使用
team-review 进行代码审查
- 发现实现 bug → 回退
team-impl 修复
- 发现 spec 遗漏 → 回退
team-spec 补全