增量代码覆盖率工具

背景

当存量代码较多时,项目单元测试整体覆盖率就会偏低,但这可能是正常现象,因此不能依据已有的全量单元测试覆盖率来判断项目质量。
基于这个背景,我们需要统计增量代码覆盖率作为项目质量的参考指标之一,并集成到 DevOps 平台。

方案

1、先通过 git diff 统计代码差异,根据差异代码选择运行单元测试案例,最后得到差异覆盖率报告
2、先运行全量单元测试案例来生成整体覆盖率报告,然后通过 git diff 统计差异代码,最后根据整体覆盖率报告和差异代码来形成差异覆盖率报告

通过比较方案 2 侵入性小,扩展好,能方便支持多种 java 覆盖率工具,还能支持 python 、js 等覆盖率工具,下面简单例子介绍下实现方案 2 的开源工具 diff-cover

diff-cover 介绍

diff-cover 用 python 开发的开源工具,github 地址是 https://github.com/Bachmann1234/diff-cover。它不仅能实现增量代码单元测试覆盖率统计,还能实现增量代码质量检查。
支持单元测试覆盖率工具或报告格式有:Cobertura、JaCoCo、JSCover、coverage.py、nosetests、JSCover 等。
支持代码检查工具或报告格式有:pycodestyle, pyflakes, flake8, pylint, checkstyle, checkstylexml、 findbugs。
鉴于公司用 Cobertura 生成单元测试覆盖率,因此 diff-cover 可以容易集成到 DevOps 平台。缺点是由于代码质量检查用的是 pmd 工具,可能 diff-cover 还不支持,

diff-cover 安装和使用

1、首先安装 python 环境,网上一堆,请 google
2、输入如下命令安装 diff-cover

pip install diff_cover

3、新建 git 项目 DiffDemo

  • 新建远程仓库 DiffDemo
  • 克隆代码
git clone https://github.com/scottlinlin/DiffDemo
cd DiffDemo

4、新建 maven 工程

  • 打开 idea 新建一个 maven 工程 DiffDemo,工程路径是 DiffDemo
  • 新建 Math 类,实现两个数相乘的简单功能
  • 新建 MathTest 类,使用 junit4 实现相乘的单元测试
  • git add & git commit 添加到本地仓库
  • git push 推送到远程仓库,此时远程和本地仓库代码一致
  • 然后本地运行 mvn cobertura:cobertura,生成覆盖报告路径是 ./target/site/cobertura/coverage.xml,此时覆盖率100%
  • 运行 diff-cover,
diff-cover target/site/cobertura/coverage.xml --compare-branch=origin/master
  • 结果应该为空,即没有新增代码也没有差异覆盖率


    scott.lin

diff-cover 参数说明

第一个参数是覆盖率报告文件,也可以填写多个文件
第二个参数是比较 git 分支 或 commit id,上诉比较是 origin/master 和 HEAD之间代码差异,origin/master 是远程 master 分支,HEAD 当前分支即指向本地 Master 最新提交

5、新增代码,统计差异覆盖率

  • Math 类新增除、平方功能代码
  • 本地运行 mvn cobertura:cobertura,生成覆盖报告
  • 运行 diff-cover,
diff-cover target/site/cobertura/coverage.xml --compare-branch=origin/master --html-report report.html
  • 输出差异覆盖率报告,即新增除和平台代码覆盖率为0,如下:


    scott.lin

6、demo 地址
https://github.com/scottlinlin/DiffDemo

展望

  • 将 diff-cover 集成到目前 DevOps 平台,并将增量覆盖率作为项目质量的一个重要指标
  • 继续 poc diff-cover 的代码质量检查命令 diff-quality ,看能否支持 pmd 生成的质量报告
  • 集成 pylint pytest 等 python 工具,用 diff-cover 实现增量代码检查

你可能感兴趣的:(增量代码覆盖率工具)