关于 zombies
ZOMBIES 是一项技能,使用 ZOMBIES 测试框架帮助开发者为功能找出有价值的测试思路。它会查找相关实现和现有测试,报告具体缺口,但不会编写或生成测试代码。
主要功能
- 01从参数或 git diff 确定功能范围
- 02基于 ZOMBIES 生成测试思路
- 03查找实现代码与现有测试
- 04识别尚未覆盖的行为
- 05按固定类别顺序整理报告
- 06不生成测试代码
适用场景
- 01检查指定功能的测试情况
- 02从分支差异中查找测试缺口
- 03围绕边界情况和失败规划测试
- 04避免重复建议已覆盖的行为
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ unlearndev/ skills --skill zombies安装后在 Claude Code 中输入/zombies确认已加载。
详细介绍
ZOMBIES
参数
原始参数:$ARGUMENTS
如果提供了参数,请将其视为自由文本功能描述(例如“验证码登录流程”“图片上传验证”)。使用 Grep/Glob 自行定位相关代码和测试。
如果参数为空,请运行 git diff main...HEAD,并将差异作为功能范围。
目标
使用 ZOMBIES 作为思考工具,找出该功能最值得编写的测试。输出一份测试点列表,供用户自行编写测试骨架——不要编写或搭建测试。
ZOMBIES 代表:
- Zero — 无输入/空状态
- One — 单个输入/正常流程
- Many — 多个输入、排序、分页、并发
- Boundaries — 边界、差一错误、最小/最大长度、时间边界、类型边界
- Interface — 公共 API 的契约/形式(返回类型、状态码、重定向)
- Exceptions — 无效输入、失败、已过期/已使用/缺失的状态、认证失败
- Simple scenarios — 真实用户日常使用的常见路径
跳过不适用的类别。 只读端点可能没有任何“Many”测试。纯验证器可能没有任何“Interface”测试。只列出确实值得编写的测试——重质量,不重覆盖率。
说明
1. 定位功能
- 有参数时:使用
Grep/Glob在代码库中搜索与描述匹配的文件。阅读实现文件(控制器、模型、操作、验证器),以及已有的测试文件(如果存在)。 - 无参数时:运行
git diff --name-status main...HEAD和git diff main...HEAD,然后阅读有变更的实现文件。跳过自动生成的文件(锁文件、编译后的资源、生成的路由/类型定义)。
2. 生成 ZOMBIES 建议
对于 ZOMBIES 的每个字母,思考:这里是否有一个测试能捕获真实 bug,或记录实际行为? 如果有,就列出;如果没有,就跳过该字母。
与现有测试文件交叉检查。 此技能输出的是待编写的测试,而不是覆盖率清单,因此:
- 跳过现有测试已充分覆盖的行为。 已覆盖的行为不属于待编写的测试;列出它们会掩盖重要的缺口。
- 保留仅部分覆盖的行为——测试涉及该行为,但缺少重要断言(例如,断言登录成功后发生重定向,却没有检查验证码是否已被使用)。在项目符号前加上
[partial],并指出缺少的断言。 - 如果不确定某项行为是否已被测试覆盖,请保留该项目,而不是将其删除——误判为“已覆盖”会悄无声息地掩盖真实缺口。
建议质量标准:
- 具体,不要泛泛而谈。 “测试电子邮件长度上限(255 个字符)”优于“测试边界”。
- 尽可能引用代码中的实际值——例如迁移中的列长度、配置中的过期时间、FormRequest 中的验证规则。
- 每个项目符号对应一个测试。 不要把“测试 A 和 B”合并在一行。
- 描述要验证的行为,而不是方法名。“已过期的登录验证码返回 422”优于“test_expired_code”。
3. 输出报告
先按功能领域分组(如果差异涵盖多个功能),再按每个功能中的 ZOMBIES 字母分组。字母始终按 ZOMBIES 顺序排列——Zero、One、Many、Boundaries、Interface、Exceptions、Simple。 跳过某个字母不会改变其余字母的顺序:展示的字母仍须按固定顺序从上到下排列(例如,即使跳过了 Zero、One 和 Many,也要先展示 Boundaries,再展示 Interface,最后展示 Exceptions)。严格使用以下格式:
## 🧟 [Feature Area]
**Boundaries**
- Email field rejects values longer than 255 chars (matches migration column)
- Sign-in code expires exactly at the 15-minute mark
**Exceptions**
- Expired code returns a validation error
- Already-used code cannot be redeemed twice
- Submitting code for an unknown email fails silently (no user enumeration)
**Simple**
- Requesting a code emails the user and creates a `SignInCode` row
- [partial] valid code logs the user in — existing test asserts the redirect but never asserts the code is consumed
🧟 前缀和 ## 级别共同使功能标题区别于加粗的 **Letter** 子标题——两者都要保留。如果涉及多个功能,请为每个功能重复此区块,并用 --- 水平线分隔,以明确标示功能边界。
最后用一行总结:X test ideas.
如果没有值得测试的内容(例如,仅有无关紧要的重命名或纯配置更改),请严格输出:
✅ Nothing worth writing tests for.
规则
- 不要编写占位测试。 此技能只输出测试思路——测试由用户编写。
- 跳过不适用的 ZOMBIES 字母。 不要写“(无)”占位内容。质量优先于覆盖率。
- 只列出缺口。 跳过已有测试已完整覆盖的行为。对部分覆盖的行为,添加
[partial]前缀,并指出缺少的断言。不确定时,保留该项——切勿悄然忽略真实缺口。 - 始终保持 ZOMBIES 顺序。 展示的部分必须按 Zero → One → Many → Boundaries → Interface → Exceptions → Simple 排列。可以跳过字母,但其余字母不得调换顺序。
- 每个功能领域中的每个字母只能有一个标题。 每个 ZOMBIES 字母在一个功能领域中最多出现一次——将该字母的所有要点汇总到同一个标题下。不要重复字母标题。
- 具体明确。 引用代码中的实际长度、时间、状态和路由名称。泛泛的建议毫无价值。
- 每个要点只描述一种行为。 不要用“并且”连接两个测试。
- 不提供实现提示。 只说明要验证什么,不要建议断言、工厂或测试设置。
- 先按功能分组,再按字母分组。 如果差异涉及多个功能,不要把所有内容都塞进一个 ZOMBIES 列表。
- 不要添加前言。 不要写“以下是我建议的测试……”。从第一个
## [Feature Area]标题开始。 - 除
X test ideas.总结行外,不要添加结束建议。