C/C++代码覆盖率统计工具:gcov&&gcovr安装和简单使用
C/C++代码覆盖率统计工具:gcov&&gcovr安装和简单使用
gcov安装
Linux ver:
gcov是gcc的自带功能 属于GNU 不用特别安装
Windows ver:
在windows下安装可以使用gcov的gcc 之前试过mingw和Cygwin64 Terminal,在后续可视化的过程中效果不是很理想,经过多方测试发现Strawberry Perl的GCC可以很好的满足后续可视化的需求。至于为什么mingw的后续可视化为什么不行 好像和llvm的仿真有关系……
在安装完成Perl以后就就可以在windows下使用gcov了。
gcovr安装
Linux下与windows下gcovr的安装大同小异 都是通过Python的pip安装 根据不同的Python版本pip会选择与此Python版本相适应的gcovr进行安装。
如果你用的操作系统还没有Python请自行安装。这里使用Python3.8版本为栗子进行说明安装过程。
在刚才安装的Strawberry Perl中已经包含了pip 所以win用户可以忽略安装pip的步骤。
如果你的电脑没有pip也请安装一个pip pip的安装方式非常简单。可以在浏览器中将下列链接右键另存后安装:
https://bootstrap.pypa.io/get-pip.py
也可以在Linux中使用curl命令进行下载
下载完成后执行语句
python get-pip.py
就可以进行安装了 如果报错可能是权限问题,添加语句sudo后执行或win下使用管理员权限。
安装好pip后。
执行语句
pip install gcovr
安装gcovr。安装的部分大功告成。
gcov与gcovr的使用
Linux和win下如何使用gcov与gcovr呢?我们以假设要编译example.cpp文件为例:
example.cpp源代码如下:其实并不局限于这个测试样例,完全自己可以根据需求写一个具有多函数多分枝跳转语句以及可以输入多种测试数据的测试样例。
1 // example.cpp 2 3 int foo(int param) 4 { 5 if (param) 6 { 7 return 1; 8 } 9 else 10 { 11 return 0; 12 } 13 } 14 15 int main(int argc, char* argv[]) 16 { 17 foo(0); 18 19 return 0; 20 }
在终端或cmd命令行里输入下句:
g++ -fprofile-arcs -ftest-coverage -fPIC -O0 example.cpp -o program
就可以生成目标可执行文件program或program.exe。请注意,我们在编译该程序时没有进行优化,因为优化可能会合并代码行,否则会更改程序中的执行流程。此外,我们使用-fprofile-arcs -ftest-coverage -fPIC编译器选项进行编译,这些选项添加了逻辑以生成可以由gcov命令处理的输出文件。
接下来我们运行程序进行测试 ,如果没有参数就直接运行就行了。
./program
windows下执行
program.exe
就表示对程序的一次执行测试。
生成文件example1.gcno和example1.gcda。这些文件由gcov处理,以生成代码覆盖率统计信息。gcovr命令调用gcov并以各种格式汇总这些代码覆盖率统计信息。
比如最基本的简单显示测试结果:
gcovr -r .
以我这里的代码为例,就会打印如下的结果:
------------------------------------------------------------------------------ GCC Code Coverage Report Directory: . ------------------------------------------------------------------------------ File Lines Exec Cover Missing ------------------------------------------------------------------------------ example.cpp 7 6 85% 7 ------------------------------------------------------------------------------ TOTAL 7 6 85% ------------------------------------------------------------------------------
此输出的每一行都包含给定源文件的摘要,其中包括已检测的行数,已执行的行数,已执行的行数百分比以及未执行的行号的摘要。为了提高清晰度,gcovr使用积极的方法将未覆盖的行分组,并将由“非代码”行(空白,独立大括号和单行注释)分隔的未覆盖行合并到一个区域中。结果,“缺少”列表中列出的行数可能大于“行”和“执行”列的差。-r选项指定要分析的文件的根目录。这使gcovr可以生成更简单的报告(没有绝对路径名),并且可以从分析中排除系统头文件。请注意,gcov按行累积统计信息。因此,它最好与一种编程风格一起工作,该编程风格每行仅放置一条语句。
这只是最基础的要求 进一步我们想要得到更为详细的代码分析报告,使用如下命令生成关于整个项目的测试结果。(因为测试用例只有一个CPP文件所以结果只有一个文件,后续会用复杂的项目进一步举例说明)
gcovr -r . --html --html-details -o example-html-details.html
这样就可以根据之前测试的结果生成一个可视化的html格式的测试报告了。如下图所示。
请注意,–html-details选项只能与-o(–output)选项一起使用。例如,如果–output选项指定输出文件coverage.html,则为每个文件生成的网页将具有coverage。<filename> .html形式的名称。
至此我们代码覆盖率测试的结果已经算是达到预期结果了,但是gcovr的功能绝不仅限于此,这只是个开始,以后的博客会进一步分析gcov的工作原理和gcovr的更强大的使用方法,并会举出更复杂的样例来加以说明。同样可以自己学习研读官网给出的相关说明来了解gcovr的强大功能。
参考文献:
pip的安装:https://pip.pypa.io/en/stable/installing/
gcovr的使用官方说明书:https://gcovr.com/en/stable/index.html
Strawberry Perl的下载地址:http://strawberryperl.com/