test-guard

test-guard

熱門

在测试代码上线或提交前,依据通用的测试规范对其进行审查(支持生成或修改的测试代码)。最适合在 Agent 编写、编辑、生成或重构测试之后被动触发,用于在展示、提交(commit)或合并(merge)前把关。适用于 pytest (test_*.py, *_test.py)、PHPUnit/Pest (*Test.php)、Jest/Vitest (*.test.ts, *.spec.js)、Go (*_test.go)、位于 tests/、__tests__/ 或 spec/ 目录下的文件,以及处理诸如“为 X 编写测试”、“新增测试”、“测试这个”、“审查这些测试”或包含测试修改的 PR Diff 审查请求。若在开始编写测试前显式调用,也可指导测试撰写。本 Skill 是防止 AI 生成测试代码膨胀与冗余的质量门禁(Quality Gate)。切勿用于生产环境或实现代码的 Code Review(请改用 clean-code-guard)、CI 或测试运行器(test-runner)配置、运行或调试测试,以及一般的架构讨论。

1126星標
133分支
更新於 2026/7/4
SKILL.md
唯讀
名稱
test-guard
描述

在测试代码上线或提交前,依据通用的测试规范对其进行审查(支持生成或修改的测试代码)。最适合在 Agent 编写、编辑、生成或重构测试之后被动触发,用于在展示、提交(commit)或合并(merge)前把关。适用于 pytest (test_*.py, *_test.py)、PHPUnit/Pest (*Test.php)、Jest/Vitest (*.test.ts, *.spec.js)、Go (*_test.go)、位于 tests/、__tests__/ 或 spec/ 目录下的文件,以及处理诸如“为 X 编写测试”、“新增测试”、“测试这个”、“审查这些测试”或包含测试修改的 PR Diff 审查请求。若在开始编写测试前显式调用,也可指导测试撰写。本 Skill 是防止 AI 生成测试代码膨胀与冗余的质量门禁(Quality Gate)。切勿用于生产环境或实现代码的 Code Review(请改用 clean-code-guard)、CI 或测试运行器(test-runner)配置、运行或调试测试,以及一般的架构讨论。

Test Guard

你在代码上线前审查新生成或修改过的测试代码。在第一轮测试编写完成、且代码尚未展示、提交或合并前,严格执行以下规范。请扮演敏锐的审查者,而非死板的挑剔者:重点找出浪费维护精力或掩盖真实 Bug 的代码,忽略无关紧要的样式偏好。

这些规范之所以存在,是因为 AI 编码 Agent 经常过度生成测试。常见的失败模式包括:高度依赖 Mock 的单元测试(仅仅断言了实现细节)、只差一个数值的近乎重复的测试主体,以及重新验证框架逻辑而非项目本身业务逻辑的测试。这些代码在 Diff 中看似很有产出,但往后每一次维护都是成本。

何时触发此 Skill

  • 编码 Agent 刚编写了新的测试函数或测试文件(适用于任何语言)
  • 你正在编辑现有的测试
  • 你正在审查包含测试变更的 Diff
  • 用户要求你编写、新增或审查测试

先理清项目的上下文

这些规范具有通用性,但具体落实需因地制宜。在开始审查前:

  1. 检查项目自带的 Agent 指引(CLAUDE.mdAGENTS.md)与测试文档。当项目专属的测试规范与本 Skill 冲突时,优先遵循项目本身的规范。
  2. 确认测试技术栈,并阅读对应的参考文档以了解具体的模式:
  3. 若项目调用了 LLM API、使用了 Agent 框架,或集成了可观测性/遥测(telemetry)机制,请一并阅读 references/llm-app-testing.md——该文档针对 LLM 应用程序补充了三条专项规范。
  4. 梳理项目的系统边界:网络调用、数据库、文件系统、时钟与随机数、第三方 SDK、LLM API。项目现有的 Fixture 与测试辅助工具通常能反映出项目划分这些边界的位置。

执行步骤

  1. 阅读测试代码:查看 Diff、新文件或正在修改的段落。
  2. 对照以下规范逐一检查每个测试。
  3. 简明扼要地报告违规项:规范编号、位置、违规原因、建议修复方式。
  4. 若用户在编写测试前显式调用本 Skill,请在撰写时直接落实规范——切勿先写出违规代码再自己标记。

编写新测试时,请针对每个测试反问:“这个测试抓住了本测试集中其他测试抓不到的什么具体 Bug?”如果无法明确回答,就不要写。

九大规范

规范 1:测试行为,而非实现

从调用者的角度测试代码的功能。断言返回值与可观察的副作用(side effects)。绝不要断言某个内部辅助函数是否带着特定参数被调用——这种测试在每次重构时都会失败,而且抓不到任何真实 Bug。

违规模式: 断言某个内部函数的 Mock 被调用了,而该函数并不属于系统边界。
修复方式: 断言调用者能观察到的返回值或状态变更。

规范 2:每一个 Mock 都必须有正当理由

仅在系统边界进行 Mock:网络与 HTTP 调用、LLM API、数据库、外部文件上的文件系统 I/O、时钟与随机数、第三方 SDK。绝不要为了隔离“单元”而 Mock 内部类或辅助函数——你自己制造的缝隙往往会掩盖最值得捕捉的集成 Bug。

当你在边界进行 Mock 时,要断言调用者如何使用响应结果,而不是断言 Mock 接收到了哪些具体参数。

规范 3:一个测试对应一个场景,多变体改用数据驱动

若两个或多个测试拥有完全相同的 Setup 流程,仅仅在输入/输出值上有所不同,请将其合并为一个数据驱动测试(@pytest.mark.parametrize、PHPUnit #[DataProvider]、Jest test.each)。

适合拆分为独立测试的情况: 不同的 Setup 流程、不同的断言、不同的 Mock 配置,或是恰好使用了同一个函数但本质上不同的业务场景。

规范 4:每个测试都必须证明其存在的价值

反问:“这个测试抓住了其他测试抓不到的什么 Bug?”删除那些只能抓到拼写错误、验证数据类默认值、或是测试微不足道透传逻辑的测试。

常见缺乏正当理由的测试: 构造函数设置属性、测试类型系统本身就已经禁止的输入、日志消息的字符串格式化、常量是否等于其字面值。

规范 5:根据场景为测试命名

命名模式:test_<scenario>_<expected_outcome>(测试_<场景>_<预期结果>)。测试名称读起来应该像一条需求规格,而不是重复函数的签名。

坏示例 好示例
test_parse_response_missing_field test_malformed_response_falls_back_to_default
test_get_language_no_class test_element_without_class_returns_empty_language
test_add_tags_single_string test_single_tag_normalizes_to_list

规范 6:线上回归测试是不可触碰的

用于复现真实线上 Bug 的测试永远是有存在价值的。请在测试名称或注释中引用对应事件(日期、Issue ID 或简短描述),且绝不要删除它们。它们不受规范 4 的限制——事件本身就是它们存在的理由。

规范 7:不要为框架自带的保障编写测试

不要去测试验证库能否正常验证、ORM 能否正常提交、路由能否正常返回 404,或者测试框架的 Fixture 能否正常运行。去测试构建在框架之上的你自己的逻辑。

违规模式: 如果删光项目所有的自定义代码只保留框架默认设置,测试依然能通过。

规范 8:状态对象与数值对象是真实存在的,绝不 Mock

绝不要 Mock 数据模型、DTO、实体(Entity)或状态对象。请直接实例化真实对象。Mock 状态对象会掩盖字段名拼写错误和校验错误——而这恰恰是最值得捕捉的 Bug。如果构造真实对象很痛苦,这属于设计反馈,而不是 Mock 的理由;可以写一个小型 Builder 或 Factory 辅助函数来简化构造。

规范 9:被测基础设施必须使用真实基础设施

当数据库查询、Schema 行为或持久化逻辑本身就是测试的主体时,请连接真实的测试数据库,并通过 Fixture 执行真实的数据库迁移(Migration)。在那种情况下 Mock Session 抓不到任何问题。只有当持久化只是被测行为的副作用时,Mock 数据库才是可以接受的。

报告格式

当指出违规项时,请统一使用以下格式:

**规范 N 违规** 位于 `tests/path/file.ext::<test_name>`
- 违规内容:<用一句话说明具体违反了什么>
- 修复建议:<用一句话说明应该如何修改>

按文件分栏汇总违规项。若某个文件没有违规,则无需提及。

严重程度指南

并非所有违规的严重点都相同。请根据实际情况做出判断:

  • 必须修复(Must fix): 规范 1、2、8 —— 这些问题会掩盖真实 Bug 或导致测试极其脆弱
  • 建议修复(Should fix): 规范 3、4、5、7 —— 这些问题会导致代码膨胀与维护负担
  • 不可触碰(Sacred): 规范 6 —— 绝不删除,始终允许
  • 值得关注(Worth noting): 规范 9 —— 属于测试架构层面;可以指出,但不要为了它而阻碍细微的修改

参考文档

  • references/pytest.md — Python/pytest 模式:parametrize、fixtures、mock 边界、真实的 Pydantic 实例
  • references/phpunit.md — PHP/PHPUnit/Pest 模式,包含 WordPress 与 WooCommerce 的测试边界
  • references/jest.md — Jest/Vitest 模式:test.each、模块 mock、msw、快照测试规范
  • references/llm-app-testing.md — 针对 LLM 应用程序的三条追加规范:Prompt 契约、可观测性集成、Agent 流程转换

本 Skill 负责的工作

  • 它不会运行测试。请使用项目本身的测试运行器(test runner)。
  • 它不会强制代码风格——那是 Linter 的工作。
  • 它不会决定要测试什么——只决定如何测试
  • 除非被要求全面审计,否则它不会标记你未动到的文件中的已有违规。