Applicable Scenarios
- Coverage target setting
- CI coverage collection
- PR coverage comments
- Coverage trend tracking
- Coverage gates
Core Principles
1. 覆盖率是基线不是目标
80% 覆盖率 ≠ 80% 质量
2. 关注增量覆盖率
新代码 ≥ 80%,比总覆盖率更有意义
-
Don't chase 100% getters / setters / configuration don't need tests
-
Look at it by layer Business logic ≥ 90% Controller ≥ 60% Utility functions ≥ 80%
-
Trends matter more than absolute values Coverage must not decrease
## 工具
| 工具 | 语言 | 用途 |
|---|---|---|
| **Codecov** | 多语言 | SaaS 报告 + PR 评论 |
| **Coveralls** | 多语言 | SaaS 报告 |
| **SonarQube** | 多语言 | 自建 + 质量门禁 |
| **Istanbul / c8** | JS/TS | 收集器 |
| **JaCoCo** | Java | 收集器 |
| **coverage.py** | Python | 收集器 |
| **go test -cover** | Go | 内置 |
## 覆盖率目标
| 层 | 目标 | 说明 |
|---|---|---|
| Domain / Service | ≥ 90% | 核心业务 |
| Controller | ≥ 60% | 集成测试覆盖 |
| Utils | ≥ 80% | 工具函数 |
| 总体 | ≥ 70% | 基线 |
| 增量(新代码) | ≥ 80% | PR 门禁 |
## CI 集成
```yaml
# Vitest 覆盖率
- run: pnpm test:coverage
- uses: codecov/codecov-action@v4
with:
files: coverage/lcov.info
fail_ci_if_error: true
# 门禁:覆盖率不能下降
- name: Coverage check
run: |
COVERAGE=$(cat coverage/coverage-summary.json | jq '.total.lines.pct')
if (( $(echo "$COVERAGE < 70" | bc -l) )); then
echo "Coverage below threshold: $COVERAGE%"
exit 1
fi
Supporting Templates
templates/coverage-config-template.md— coverage configuration + targets + CI
Quality Self-Check
□ 覆盖率目标设定
□ CI 自动收集
□ PR 评论(增量)
□ 门禁(不能下降)
□ 趋势跟踪
□ 分层目标
□ 不追求 100%
Common Pitfalls
- Chasing 100%——testing getters is a waste of time
- Only looking at total coverage——new code at 0% can still pass
- Not setting gates——coverage keeps declining
- Coverage = quality——covered doesn't mean tested correctly
- Not looking at trends——single-point data is meaningless
Collaboration with Other Skills
上游:
unit/integration/e2e → 测试代码产生覆盖率
下游:
ci-test-integration → CI 收集
qa-engineer quality-gate → 门禁条件