agentleFS
andeyaandeya/team-skills/skills/team-test/SKILL.md

team-test

Skill4 starsChanged 5 months agoMITView on GitHub

Use when implementation exists and you need test matrix + coverage audit

1 other project uses a version of this.

Adopted by

Most recently taken up by

The file

Files
SKILL.md

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 规格,不被实现偏见引导。

推理框架:

  1. SDD 覆盖:每条业务规则、边界条件、异常场景是否都有对应测试?
  2. 测试质量:实现被完全重写后测试仍有意义吗?引用内部实现细节 = 测实现而非需求
  3. 缺口归因:team-impl 遗漏(→ team-impl)还是 SDD 未定义(→ team-spec)?
  4. 路由决策:根据缺口根因,回退到哪个 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 密度最高的区域——必须逐条提取。

  1. READ 03-sdd.md → 提取所有:
    • 正常路径(Happy Path)
    • 边界条件(§七)
    • 异常场景(§八)
  2. READ 06-tdd-log.md → 了解 team-impl 已覆盖的测试
  3. READ team-impl 实现代码 → 检查未测试的分支
  4. READ 04-boundary.md → 确认兼容性约束
  5. 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(首个命中即停):

  1. READ("05-risk.md", "§一验证计划")(精简模式下不存在属于正常)
  2. READ("CLAUDE.md").verify_cmd / READ(".cursor/rules/")
  3. READ("package.json").scripts.test / READ("Makefile") / READ("Cargo.toml") / READ("CI 配置")
  4. 手动验证可行(截图 / curl / 日志对比)→ 标注验证方式,继续
  5. 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

  1. EXEC verify_cmd → 记录当前基线(总用例数 / 通过数 / 失败数,Phase 5 §八 回归对比用)
    • ASSERT exit_code == 0 || 基线已知失败已记录
    • IF exit_code != 0 → 记录失败基线(区分本任务相关 vs 既有失败),继续
  2. WRITE 补充测试文件 → 按项目测试风格编写,使用 test: (audit) 前缀 commit
  3. 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 → 意图不清,无法从名称判断测试了什么。

  1. EXEC verify_cmd(Phase 3 已 RESOLVE)
  2. 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(附失败输出 + 已排除的假设)
  3. FOR new_test(隔离验证——确认每个新测试不依赖其他测试的执行顺序或副作用):
    • EXEC new_test(单独运行确认独立通过)
    • IF exit_code != 0 → 标记隔离问题
    • IF 依赖其他测试副作用 → 重构为 setup/teardown
  4. READ output → WRITE 10-test-report.md §三(最后 20 行输出 + pass/fail 统计 + 退出码)
  5. 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.mdreferences/09-test-matrix-template.md四维测试矩阵(含维度标注、SDD 追踪、来源标签)
10-test-report.mdreferences/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 产出前自检(全部通过才放行):

  • ASSERT 09-test-matrix.md EXISTS && 10-test-report.md EXISTS && 有效行数 ≥ 5
  • ASSERT 矩阵覆盖 SDD 所有业务规则 — 逐条对照 03-sdd.md §二
  • ASSERT 每条 SDD §二 业务规则至少 2 个测试用例(≥ 1 正向 + ≥ 1 反向/边界)
  • ASSERT 四维覆盖(功能/边界/异常/代码)均已检查
  • ASSERT 覆盖声明已标注来源标签({extracted} / {inferred})
  • ASSERT 补充测试已运行通过 && failures == 0
  • ASSERT 全量测试结果已记录到 10-test-report.md(含最后 20 行输出 + 退出码 + §八回归验证)
  • ASSERT 路由决策已明确(→ team-review / → team-impl / → team-spec / → ASK_HUMAN)
  • ASSERT spec 遗漏已向编排器报告(IF 无 spec 遗漏 → 跳过)
  • ASSERT 无占位符残留({N}、{slug} 等已被实际值替换)
  • ASSERT IRON_LAW 遵守 — 未擅自修改实现代码、未跳过失败测试
  • SDD 中的每个边界条件和异常场景都有对应测试吗?我是否因为"不太可能发生"跳过了某个?
  • 如果删掉实现中的某行关键代码,我的测试套件能发现吗?

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 补全

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.