关于 principle-test-behavior-not-implementation
Test Behavior, Not Implementation 是一项测试技能,强调验证可观察行为,而非内部调用或重复常量。它提供识别弱断言的方法,并指导改写或删除无效测试。
主要功能
- 01检查测试是否验证可观察行为
- 02识别薄弱及自我引用断言
- 03用行为检查替代常量固定断言
- 04删除无法发现缺陷的测试
适用场景
- 01决定是否保留现有测试
- 02为具体输入改进断言
- 03精简无法发现缺陷的测试
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ hachej/ boring-stack --skill principle-test-behavior-not-implementation安装后在 Claude Code 中输入/principle-test-behavior-not-implementation确认已加载。
附带文件LICENSE
详细介绍
测试行为,而非实现
测试应以用户使用代码的方式调用代码,并将观察到的结果与字面预期值进行断言。断言代码进行了哪些调用,或复述代码中已有的常量,都做不到这一点。
检查方法:保留测试前,先问自己:如果它导入的每个函数都返回 undefined,测试是否仍会通过?如果会,它就没有观察任何行为,也无法因缺陷而失败。重写断言,或删除测试。
**原因:**无法因缺陷而失败的测试会占用 CI 时间和评审精力,却发现不了任何问题。固定断言常量也会在有人编辑该常量或它复述的提示词时失败,因此会阻止这类编辑。
以下五种测试,即使每个导入的函数都返回 undefined,仍会通过:
- 断言过弱或没有断言。 没有
expect,或只使用toBeDefined、toBeTruthy、not.toThrow、toBeInstanceOf、toBeGreaterThan(0)。 - 只检查模拟对象或缺失情况。 只使用
toHaveBeenCalled、not.toHaveBeenCalled、toBeUndefined、toEqual([])、toHaveLength(0)、not.toBe(wrongValue)。 - 自我引用。 预期值来自被测代码:
expect(f(a)).toBe(f(a))、expect(parsed.url).toBe(buildUrl(...))。 - 固定常量。 断言复述手动维护的常量、配置默认值、表格行或提示词字符串:
expect(LIMITS.maxTools).toBe(8)、expect(PROMPT).toContain("You are")。 - 用夹具断言夹具。 断言读取了测试构造的数据,或在
beforeEach中计算出的值,而测试主体从未运行。
**修复方法:**在测试主体中用一个具体输入调用被测对象,并断言字面输出或可观察到的效果,例如 expect(slugify("Hello, World!")).toBe("hello-world")。要断言某种情况不存在,也要在同一个测试中断言另一种输入下该情况存在。对于常量,应使用一个输入测试读取该常量的机制,而不是复述常量值。对于模拟对象,应断言它收到的有效载荷或调用后的状态,而不是断言它被调用过。如果不存在这样的断言,就删除测试。
保留检查表格行之间关系的测试(例如某个键同时存在于两张表中,或某个父项确实存在),以及 *.test-d.ts 文件中的编译时检查。
评论
支持 Markdown