承接这篇文章,本文讲述gcovr的一些使用细节。

在实际使用过程中,发现gcovr比lcov好用,其基于python,可以跨平台,而且命令简单智能(lcov的一个优势是可以查看内核代码的覆盖率)


一 安装

环境:ubuntu 21.04 (需要先执行命令指定一下python是python3 : sudo apt install python-is-python3)

有2种方式安装:

  1. pip3命令安装,如下,-U可以保证安装最新版,本文写作时最新版是5.0

    pip3 install -U gcovr
    
  2. 源码安装,可以保证安装最新版,稍微麻烦点

    首先去github下载源码包,https://github.com/gcovr/gcovr/releases,也可以使用git去下载,都是一样的。
    下载好后解压,然后cd进入源码根目录,最后执行下面的命令进行安装,要求python版本是3.6+

    python setup.py build # 构建
    sudo python setup.py install # 安装
    

    安装过程中需要去下载3个python库:jinja2,lxml和pygments,有可能会下载很慢,这时可以先手动使用pip3去下载,

    pip3 install jinja2 -i https://pypi.douban.com/simple/
    pip3 install lxml -i https://pypi.douban.com/simple/
    pip3 install pygments -i https://pypi.douban.com/simple/
    

    接着修改源码目录下的setup.py,把里面的下载操作注释掉,
    在这里插入图片描述
    最后重新执行安装命令就行了,

    sudo python setup.py install # 安装
    

    安装完后使用以下命令查看版本,正确输出版本号说明安装成功!

    gcovr --version
    

二 使用细节 ------ 过滤操作

本人在使用过程中,用到最多的是过滤操作,就是指定哪些代码需要检查,哪些不需要检查,使用的语法是正则表达式,使用gcovr --help查看过滤的帮助信息,如下,
在这里插入图片描述
其中,-f-e是在源码里进行过滤,后面三个--gcov-filter, --gcov-exclude--exclude-directories则是从生成的gcov数据文件里进行过滤,即.gcno和.gcda文件

过滤操作很重要,但是官方教程里没有给例子,网上搜了一圈也没搜到用法,最后自己在gcovr的源码查找,才发现是要使用正则表达式,而且是正规的正则表达式

1. 使用源码名过滤

例如这篇文章中的例子,假设我们想查看目录名字中包含myfunc,源码文件名中不包含myfunc1,且是cpp文件,那么就该这么写,

mkdir -p CoverageGcovr # 如果目录不存在,必须先创建,gcovr不会去创建不存在的目录
gcovr -r ../ -f '../myfunc.+/' -e '.+myfunc1\.cpp' -e '.+\.h' --html --html-details -o CoverageGcovr/index.html

PS: -r用来指定源码根目录

也可以直接使用-f来指定需要的源码(源码不多的情况下),如下,只需要myfunc2和myfunc3,

gcovr -r ../ -f '.+myfunc[2-3].+'  -e '.+\.h' --html --html-details -o CoverageGcovr/index.html

最后html报告如下,
在这里插入图片描述
点击myfunc2.cpp进行细节查看,
在这里插入图片描述

2. 使用gcov数据名过滤

如果使用gcov数据进行过滤,则这样写,

mkdir -p CoverageGcovr # 如果目录不存在,必须先创建,gcovr不会去创建不存在的目录
gcovr -r ../ --gcov-filter '.+myfunc.+' --gcov-exclude '.+myfunc1.+' --html --html-details -o CoverageGcovr/index.html

同理,也可以直接指定需要的,

gcovr -r ../ --gcov-filter '.+myfunc[2-3].+' --html --html-details -o CoverageGcovr/index.html

--exclude-directories是排除某些个包含gcov数据的目录,同样使用正则表达式,这里还要把测试文件给删除掉

gcovr -r ../ -e '.+test.cpp' --exclude-directories '.+myfunc1.+' --html --html-details -o CoverageGcovr/index.html

总之,这5个选项根据需要可以任意组合,如果有问题就多尝试…


三 使用细节 ------ 设置html的报告标题

这个比较简单,使用选项--html-title

gcovr -r ../ -f '.+myfunc[2-3].+'  -e '.+\.h' --html --html-details --html-title 'My Test Report' -o CoverageGcovr/index.html

结果如下,
在这里插入图片描述
还有其它一些与html设置有关的选项,如设置每个threshold的颜色,和threshold的比例等(0,75,90),不过一般默认的就可以了

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐