- 一款针对C/C++的代码覆盖率分析统计工具;
- 基于GCOV,用于收集GCOV产生的覆盖率信息,并且使用HTML方式展现。
- 它其实和lcov类似,但lcov使用perl开发的,看到那变态的“$$$$$$$$”人就彻底崩溃了,完全不利于我们这种二次开发的需求。另外一方面,我看到eclipse推出的Linux Tools中有gcov这一项,因此我就想利用它的API来帮助我解析gcc的覆盖率信息(这个是关键点)。只要有了这一信息,后面的操作无非就是对函数、分支、目录的统计。
- 支持根据差异信息(如svn diff得到的diff信息)来计算增量覆盖率信息
- 支持在统计信息中忽略任意的文件和目录
- 另一种计算函数、分支覆盖率的方式
- 在具体某一个文件的覆盖率展示方面,界面更为清爽,而且还具有代码高亮的
因为这个工具还是基于gcov的那一套统计覆盖率的原理,因此 在编译选项中还是需要加上这三个变量选项:
-g -ftest-coverage -fprofile-arcs
注意:
原本的gcov其实并不要求加上 -g 参数,它是让用户通过 --object-directory 选项来指定cpp文件对应到哪一个目标文件(*.o文 件)来找到覆盖率信息的。
但我这边是批量计算各个文件的覆盖率信息,因此需要加上-g这 个参数,这样就可以通过解析目标文件(*.o文件)来得到cpp文件。这点大家一定得注意一下。
Step 1: 安装本地的依赖包:
$ sh add-libs.sh
Step 2: Maven编译:
$ mvn clean package
编译打包成功后,会在target目录下产生 DiffCoverage.jar
文件
java -jar DiffCoverage.jar
--debug : 打印debug日志,用于调试
--diffFile diffFile : 如果计算增量覆盖率,需要通过这个参数指定diff文件
--help : 打印这个帮助信息
--ignoreFile ignoreFile : 可以通过这个参数指定那些文件或者目录不要算在覆盖率统计信息中
--isNormalDiffFormat : 由于svn diff的格式有两个信息,默认是Unified Diff Format;另外一种Normal格式
--output output : 指定HTML目录的输出
--projectPath projectPath : 项目路径,默认是当 前目录
--isIncrement : 如果是需要计算增量覆盖率,需要指定这个参数,因为默认是计算全量 覆盖率工具的
--version : 输出当前版本
$ java -jar DiffCoverage.jar --output /home/admin/web/xx --projectPath util/
这样就会把util这个目录下的覆盖率信息保存到/home/admin/web/xx中了
$ java -jar DiffCoverage.jar --projectPath . --output ~/xx4 --isIncrement --diffFile diff.txt
通过--isIncrement
来指定说是我这次计算的是增量覆盖率
通过--diffFile
来指定diff文件
这个也比较好办,可以通过svn diff的扩展来diff时忽略红白行的改变:
$ svn diff --diff-cmd '/usr/bin/diff' -x -w -x -b -x -B -x -u -r 87426 > diff.txt1
这个首先编辑一个文件,文件名随便,文件的内容格式如下(YAML格式):
# 需要忽略的文件,只要写文件名就可以,支持正则表达式
ingoreFiles:
- Statistic
# 需要忽略的文件,只要写目录名就可以,支持正则表达式
ignoreDirs:
- config
#
是YAML格式的注释
然后通过类似这样来指定这个忽略文件:
$ java -jar ~/DiffCoverage.jar --projectPath . --output ~/xx4 --type upgrade --diffFile diff.txt1 --ignoreFile ~/ignore.yaml