核心定位
本技能提供跨语言、跨框架的测试编写通用纪律,聚焦于测试质量本身而非具体工具链。其核心价值在于建立"测试必须能失败"的硬核标准,识别并抵制常见的测试反模式与自我合理化借口。
核心用法
测试设计三原则
1. 单一行为原则:测试名含"and"即需拆分,每个测试验证恰好一个行为
2. 三源覆盖法:从用户需求、已实现功能、对外宣称行为三个独立来源推导测试用例,确保无遗漏
3. DAMP优于DRY:测试内适度重复以提升可读性,共享 setup 以减少噪音但不隐藏意图
测试金字塔配比
- ~80% 单元测试(毫秒级,无 I/O)
- ~15% 集成测试(组件边界,真实依赖)
- ~5% E2E 测试(关键路径,高维护成本)
真假对象选择
优先使用真实对象:数据库查询、内部服务、文件系统操作;仅在外部边界(HTTP API、支付网关、邮件服务)使用 mock。框架提供的专用 fake(如 Laravel Queue::fake())除外。
断言规范
- ✅ 断言结果:
assert user exists in database - ❌ 断言实现:
assert repo.save() called once
Bug 修复证明模式(非协商)
1. 写测试复现 bug → 运行并确认失败(失败原因正确)
2. 应用修复 → 运行并确认通过 + 回归测试通过
跳过第一步 = 无证明;测试立即通过 = 未捕获 bug
显著优点
- 反模式识别系统:完整列举测试替身滥用、快照依赖、框架测试、mock 不完整等 7 类反模式,每类附症状识别与修复方案
- AI 生成测试嗅探:针对 LLM 生成测试的 6 类典型缺陷(mock 被测系统、循环断言、未审查快照、无断言、过度宽泛匹配器、实现回声断言)提供检查清单
- 沉默失败覆盖:强制要求对空 catch、吞掉 rejection、错误转换等路径断言可观测信号,防止"测试通过但生产静默崩溃"
- 借口抵抗机制:内置理性化借口对照表,对冲"太简单不测"" deadline 紧"等 13 种常见拖延
潜在局限
- 非技术中立:虽声称通用,但示例与反模式术语偏向 Web/API 开发场景(路由、ORM、序列化器),嵌入式或数据科学项目需自行映射
- 比例刚性:80/15/5 金字塔比例对特定领域(如数据管道、CLI 工具、区块链合约)可能不适用,文档仅简略提及调整可能未给具体指南
- 缺少度量指导:强调"运行足够快"(<30秒单元测试套件)但未提供渐进式优化策略或性能回归防护
- 依赖外部技能:框架具体实现需跳转至
ia-php-laravel、ia-react-frontend等技能,孤立使用时可能产生"知道原则不知如何落地"的落差
适合人群
- 初级-中级开发者:建立测试思维范式,避开常见新手陷阱
- 技术负责人:制定团队测试规范与代码审查 checklist
- AI 辅助编程用户:对照检查 LLM 生成测试的质量缺陷
- 遗留代码维护者:识别现有测试债务并规划偿还路径
常规风险
- 过度 mock 惯性:开发者可能因"mock 方便"而忽视真实对象优先原则,导致测试通过生产崩溃
- 证明模式走形式:团队可能形式上执行"先写失败测试"但未验证失败原因正确,造成虚假安全感
- 检查清单机械化:Verify 章节的 8 项 checklist 若不加理解地勾选,可能流于形式(如"每个公共函数至少一个测试"可能导致低价值测试膨胀)
- 与框架技能割裂:单独激活本技能而不激活对应技术栈技能时,可能产生原则与实现脱节,建议配对使用