相比于全量代码单元测试覆盖率,增量代码单元测试覆盖率,粒度更小,可以帮助开发者精准的了解每个新特性、新功能甚至每次Commit的代码覆盖率。
文章目录
前言
今年开始,部门将代码的单元测试覆盖率纳入KPI考核范围。领导定了两个考核指标,一个是整个工程的单元测试覆盖率,另外一个是,每个特性需求的增量测试覆盖率。
1. Codecov
Codecov是一个代码覆盖率分析网站,旨在通过各个维度和检测指标帮助开发者开发更加健壮的程序。
- 粒度细。全量代码覆盖率报告,针对每个Commit,每个文件的有相对、绝对、增量覆盖率
- 对GitHub开源项目免费。对GitHub工作流非常友好。集成非常方便。
- 支持的测试覆盖率工具多。支持的报告种类多。
分析报告非常的详细,针对开源项目而言是不可多得的工具。假如你的项目是开源项目或者能使用此类第三方覆盖率检查报告的话? 本文的后续内容对您没有任何帮助,可以直接忽略
2. "定制"测试覆盖率工具
公司的老项目,不太方便开源。so没办法享受“免费”的午餐。
搜索Jenkins的测试覆盖率工具。对比如下:
-Codecov- | -JaCoCo Plugin- | -Code-coverage-api- | |
---|---|---|---|
价格 | 开源项目免费 | 免费 | 免费 |
全量代码覆盖率 | ✔ | ✔ | ✔ |
代码健康度告警 | ✔ | ✔ | ✔ |
代码覆盖率变化趋势 | ✔ | ✔ | ✔ |
支持的报告种类 | 非常多 | 仅JaCoCo | 少 |
粒度 | 代码行 | 代码行 | 代码行 |
增量代码覆盖率 | ✖ | ✖ | ✖ |
扩展性 | 非常强 | 仅Java | 可扩展 |
最后选择code-coverage-api-plugin的,基于此插件扩展增量覆盖率的功能。由于新增了依赖,且功能依赖于Git作为版本控制工具,所以此特性被拒绝合并。对此我感到遗憾。所以fork了原仓库的代码,独立发布了此特性功能。言归正传,下面开始干货
2.1. 使用JGit进行代码差异分析
要统计本次提交的增量覆盖率首先要能分析代码的增量变化。
我们项目使用的时Git作为版本控制,Git提供了diff工具,可以对比文件的变化。详细参考"git diff"。在此不赘述。
根据git diff的结果进行差异分析。代码如下:
try (Git git = Git.open(new File(gitRepoPath))) {
Stream<DiffEntry> stream = getDifferentBetweenTwoCommit(git, oldCommit, newCommit);
if (null == stream)
return null;
try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
DiffFormatter df = new DiffFormatter(out);
// ignores all whitespace
df.setDiffComparator(RawTextComparator.WS_IGNORE_ALL);
df.setRepository(git.getRepository());
List<SourceCodeFile> map = stream.map(diffEntry -> {
try {