ia-writing-tests

🧪 编写能失败的测试,拒绝测试表演

通用测试编写规范:强调真实断言、反模式识别与借口抵抗,适用于任何语言或框架的测试设计与质量提升。

收藏
4.9k
安装
1.1k
版本
3.0.5
CLS 安全扫描中
预计需要 3 分钟...

使用说明

核心定位

本技能提供跨语言、跨框架的测试编写通用纪律,聚焦于测试质量本身而非具体工具链。其核心价值在于建立"测试必须能失败"的硬核标准,识别并抵制常见的测试反模式与自我合理化借口。

核心用法

测试设计三原则

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-laravelia-react-frontend 等技能,孤立使用时可能产生"知道原则不知如何落地"的落差

适合人群

  • 初级-中级开发者:建立测试思维范式,避开常见新手陷阱
  • 技术负责人:制定团队测试规范与代码审查 checklist
  • AI 辅助编程用户:对照检查 LLM 生成测试的质量缺陷
  • 遗留代码维护者:识别现有测试债务并规划偿还路径

常规风险

  • 过度 mock 惯性:开发者可能因"mock 方便"而忽视真实对象优先原则,导致测试通过生产崩溃
  • 证明模式走形式:团队可能形式上执行"先写失败测试"但未验证失败原因正确,造成虚假安全感
  • 检查清单机械化:Verify 章节的 8 项 checklist 若不加理解地勾选,可能流于形式(如"每个公共函数至少一个测试"可能导致低价值测试膨胀)
  • 与框架技能割裂:单独激活本技能而不激活对应技术栈技能时,可能产生原则与实现脱节,建议配对使用

ia-writing-tests 内容

references文件夹
手动下载zip · 9.3 kB
rationalization-table.mdtext/markdown
请选择文件