Writing Tests:通用测试编写规范评估
核心定位
本技能定位为跨语言、跨框架的测试编写原则指南,强调"测试必须能够失败"这一根本前提,反对以Mock为中心的"测试剧场",主张用真实对象验证真实行为。
核心用法
1. 测试金字塔分层策略
- 单元测试(~80%):毫秒级、隔离、无外部依赖,构成反馈基础
- 集成测试(~15%):验证组件边界——真实数据库、服务层联动、队列消费
- E2E测试(~5%):关键用户路径,需论证维护成本
2. 三重来源覆盖率验证
强制要求每个测试项映射到至少一个来源:
- 用户需求(规格/工单/对话)
- 已实现功能(代码diff扫描)
- 响应中的声明(即将告知用户的功能)
3. DAMP优于DRY原则
测试应独立可读,允许重复以降低认知负担,仅在"减少噪声且不隐藏意图"时提取共享设置。
4. 真实对象优先矩阵
| 用真实对象 | 用Mock/Fake |
|-----------|-------------|
| 数据库查询(测试库) | 外部HTTP API |
| 内部服务类 | 支付网关 |
| 临时目录文件操作 | 邮件/SMS发送 |
| 业务逻辑转换 | 带限流的第三方SDK |
例外:框架专用测试替身(如Laravel Queue::fake()、React测试提供者)属惯用做法。
显著优点
1. 反模式识别深度:涵盖11种具体反模式,包括AI生成测试的6类特征性缺陷(Mock被测系统、循环断言、未审查快照、无断言执行、过度宽泛匹配器、实现回声断言)
2. 缺陷覆盖策略:独创"静默失败检测"清单,强制要求对空catch块、被吞没的reject、缺失async处理等路径添加可观测信号断言
3. 证明模式(Bug修复):强制"失败→通过"双运行验证,确保测试捕获的是真实缺陷而非巧合
4. 状态污染诊断:提供"整数倍差异"诊断法识别持久化测试基础设施的跨运行污染
5. 框架互补设计:明确区分原则层(本技能)与实现层(ia-php-laravel、ia-react-frontend),避免重复
潜在局限
1. 未覆盖性能测试:专注功能正确性,未涉及负载/压力/基准测试规范
2. 缺失变异测试:未讨论mutation testing作为覆盖率质量补充手段
3. 并发测试深度有限:虽提及竞态条件,但未系统覆盖多线程/分布式系统的确定性测试策略
4. 契约测试缺席:微服务场景下消费者驱动契约(CDC)测试未涉及
5. 测试数据管理:仅提及fixture和工厂,未深入测试数据生命周期治理(如PII脱敏、数据子集策略)
适合人群
- 全栈开发者:需要在不同技术栈间保持一致测试质量标准的团队
- 代码审查者:需要系统性的测试质量检查清单
- AI辅助编程用户:需要识别和修正LLM生成测试陷阱的开发者
- 遗留代码维护者:面临"无测试→不敢重构→更难测试"死锁的团队
常规风险
| 风险类别 | 具体表现 | 缓解措施 |
|---------|---------|---------|
| 过度Mock化 | 测试通过但生产崩溃 | 强制真实对象优先矩阵,仅在外部边界使用Mock |
| 实现耦合测试 | 重构导致测试成批失败 | 断言结果而非调用次数/参数 |
| 假阴性安全感 | 高覆盖率但关键路径未覆盖 | 三重来源验证,静默失败检测 |
| 测试维护成本失控 | E2E测试膨胀拖慢反馈 | 严格执行5%E2E上限,持续论证成本 |
| 状态泄漏污染 | 本地通过CI失败/反之 | 强制短暂容器化基础设施,禁用自清理假设 |
| LLM生成陷阱 | 循环断言、Mock被测系统 | 提交前强制6项AI测试气味扫描 |
集成关系
- 上游调用:
ia-work(功能开发Phase 2)、ia-debugging(缺陷重现)、ia-verification-before-completion(完成前验证) - 下游依赖:
ia-php-laravel、ia-react-frontend(框架具体实现)
总体评估
作为测试原则层的权威参考,本技能在反模式识别、缺陷检测策略、AI生成测试审查方面具有显著独创价值。其局限性(性能测试、契约测试)由明确的技能边界声明所界定,不构成质量缺陷。建议作为所有项目测试规范的强制性基准,配合技术特定技能形成完整测试能力矩阵。