用途
该技能用于指导编写高信号的自动化测试,避免“测试表演”。它适用于在添加、审查、删除或重构单元测试、集成测试、属性测试、黄金测试、fixture 等场景。核心规则是:没有赚得的信号,就不写测试。不要为了镜像一次 diff、保留一个字面量或让微小改动看起来更安全而添加测试。一个测试只有在其证明的行为能够独立于本次编辑而回归时,才值得存在。
主要能力
该技能提供了一套判断测试是否值得编写的标准,以及应避免的测试类型和推荐的测试形态。
测试是否值得写
一个测试只有通过以下所有条件才值得存在。若有一条不满足,就重写或不写。
- 行为而非实现:断言可观察的契约,如返回值、抛出的错误、持久化状态变化、渲染/导出输出、API/CLI 响应、生成产物或外部可见副作用。无害的内部重构不应使其失败。
- 对变异敏感:如果行为有细微错误,至少有一个断言会失败,例如条件被取反、边界改变、返回常量或持久化状态缺失。
- 非平凡:不是 getter 返回设置的值、不是透传辅助函数返回输入、不是包装器调用其包装的函数、不是枚举数组等于其手抄字面量、不是公共导出断言、不是类型系统的运行时断言。
- 独立:可单独运行且任意顺序通过。没有共享可变状态、隐藏时钟耦合或 fixture 顺序依赖。
- 正确层级:纯计算/解析器/归约器/选择器逻辑属于快速单元测试。数据库、模式、验证器、权限、运行时和多单元接线行为属于使用项目真实测试装置的集成测试。完整用户旅程属于端到端验证。
- 不重复:相同行为尚未在更便宜的层级被覆盖。
对于缺陷修复,从原始失败开始。最高价值的验证通常是失败的路由、API、浏览器流程、命令或集成接缝。为修复过程中发明的辅助函数写单元测试不算回归覆盖,除非该辅助函数拥有失败行为。
不要添加这些
- 镜像实现数据或单个变更字面量的测试:静态配置行、目录状态、导航成员、路由表、功能标志默认值、标签、文案或状态列表。
- 测试库已拥有的库行为。
- 仅因代码被提取而创建的测试。
- Getter/setter、透传、单行包装器、公共导出或仅类型测试。
- 断言 mock 被调用时参数恰好等于测试告诉它的内容的测试。
- 当提取逻辑加浏览器/端到端验证更直接证明行为时,进行 React/组件挂载测试。
- 无法捕获其声称覆盖的缺陷类别的假集成测试,例如为依赖真实模式、验证器、索引、触发器、权限或运行时行为的行为手写数据库模拟器。
- 将在没有推理的情况下重新生成的快照或黄金文件。
好的测试形态
- 业务计算、状态转换、验证、过滤、派生、权限、解析器行为、数据转换、生成契约、跨文件一致性、幂等性和类级不变量。
- 属性测试用于广泛不变量,如往返、守恒、交换律、归一化、单调性或“在边界处舍入一次”规则。优先选择不变量属性而非“不抛出”属性。
- 集成测试用于依赖真实模式、验证器、索引、触发器、权限、提供者/运行时边界或多单元接线的行为。
- 黄金测试仅当产物本身是契约时:发出的事件形状、公共协议输出、渲染文档文本/结构、迁移行为、生成代码或提供者响应解析。保持更新命令显式,并且仅在有意时重新生成。
使用方式
遵循项目既有的测试架构:运行器、目录布局、fixture 约定、文件名后缀、包脚本和分层。不要发明并行模式。
如果项目有默认运行器,使用它。仅在存在真实强制约束时使用替代运行器,例如所需运行时、DOM 环境、原生视觉测试装置、模块重置设施、框架编译器或集成测试库。不要在一个包或表面中混合运行器,除非有明确的项目规则。
Fixture 和构建器应放在测试旁边,除非项目有共享 fixture 约定。提供者/API fixture 应保留真实响应的语义;必要时削减大小,而非含义。
AI 编写指导
先写断言,再写设置。每个测试优先一到三个有意义的断言。针对代理容易跳过的失败模式:空值、空、边界、错误、并发、权限和业务规则边缘。
运行目标测试和触及表面所需的项目检查。对于缺陷修复,在可行时证明测试会在原始失败上失败。
适用场景
该技能适用于任何需要编写、审查、删除或重构自动化测试的软件开发场景,特别是当团队希望避免低价值测试、减少测试维护成本、提高测试信号质量时。它适用于单元测试、集成测试、属性测试、黄金测试、fixture 管理等。
限制
该技能未提供具体的代码示例、安装命令或平台限制信息。它是一套原则和指导,而非可直接安装的工具。具体实施需结合项目既有的测试架构和运行器。