mcpField
P
principle-test-behavior-not-implementation

principle-test-behavior-not-implementation

github.com/hachej测试与质量160 次安装3 天前更新
代码仓库

关于 principle-test-behavior-not-implementation

Test Behavior, Not Implementation 是一项测试技能,强调验证可观察行为,而非内部调用或重复常量。它提供识别弱断言的方法,并指导改写或删除无效测试。

主要功能

  1. 01检查测试是否验证可观察行为
  2. 02识别薄弱及自我引用断言
  3. 03用行为检查替代常量固定断言
  4. 04删除无法发现缺陷的测试

适用场景

  1. 01决定是否保留现有测试
  2. 02为具体输入改进断言
  3. 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