测试覆盖率(Test Coverage)
来源: affaan-m/everything-claude-code 原始文件: commands/test-coverage.md, rules/common/testing.md 整理日期: 2026-02-21
最低测试覆盖率要求:80%
必需的测试类型
- 单元测试(Unit Tests) — 单个函数、工具方法、组件
- 集成测试(Integration Tests) — API 端点、数据库操作
- E2E 测试(E2E Tests) — 关键用户流程(根据语言选择框架)
步骤一:检测测试框架
| 识别标志 | 覆盖率命令 |
|---|---|
jest.config.* 或 package.json 中有 jest |
npx jest --coverage --coverageReporters=json-summary |
vitest.config.* |
npx vitest run --coverage |
pytest.ini / pyproject.toml 中有 pytest |
pytest --cov=src --cov-report=json |
Cargo.toml |
cargo llvm-cov --json |
pom.xml 且含 JaCoCo |
mvn test jacoco:report |
go.mod |
go test -coverprofile=coverage.out ./... |
步骤二:分析覆盖率报告
- 运行覆盖率命令
- 解析输出(JSON 摘要或终端输出)
- 列出 低于 80% 覆盖率 的文件,按最差排序
- 对每个未充分覆盖的文件,识别:
- 未测试的函数或方法
- 缺失的分支覆盖(if/else、switch、错误路径)
- 膨胀分母的死代码
步骤三:生成缺失的测试
对每个覆盖不足的文件,按以下优先级生成测试:
- 正常路径(Happy Path) — 使用有效输入的核心功能
- 错误处理 — 无效输入、缺失数据、网络故障
- 边界情况(Edge Cases) — 空数组、null/undefined、边界值(0、-1、MAX_INT)
- 分支覆盖 — 每个 if/else、switch case、三元运算
测试生成规则
- 测试文件放在源文件旁边:
foo.ts对应foo.test.ts(或遵循项目约定) - 使用项目中已有的测试模式(导入方式、断言库、Mock 方案)
- Mock 外部依赖(数据库、API、文件系统)
- 每个测试应独立运行 — 测试之间不共享可变状态
- 使用描述性命名:
test_create_user_with_duplicate_email_returns_409
步骤四:验证
- 运行完整测试套件 — 所有测试必须通过
- 重新运行覆盖率 — 验证改善情况
- 如果仍低于 80%,对剩余缺口重复步骤三
步骤五:生成报告
展示前后对比:
覆盖率报告
──────────────────────────────
文件 之前 之后
src/services/auth.ts 45% 88%
src/utils/validation.ts 32% 82%
──────────────────────────────
总体: 67% 84%
测试驱动开发(TDD)
必须遵循的工作流
- 先写测试(RED)— 编写描述预期行为的测试
- 运行测试 — 测试应该失败
- 编写最小实现(GREEN)— 用最少的代码让测试通过
- 运行测试 — 测试应该通过
- 重构(IMPROVE)— 改进代码质量
- 验证覆盖率(80%+)
重点关注区域
- 复杂分支逻辑的函数(高圈复杂度 / Cyclomatic Complexity)
- 错误处理器和 catch 块
- 跨代码库使用的工具函数
- API 端点处理器(请求到响应的完整流程)
- 边界情况:null、undefined、空字符串、空数组、零、负数
排查测试失败
- 使用 tdd-guide Agent 辅助
- 检查测试隔离性
- 验证 Mock 是否正确
- 修复实现而非测试(除非测试本身有误)
Agent 支持
- tdd-guide — 在开发新功能时主动使用,强制执行"先写测试"的工作流