最近,因为要展示某项目的单元测试的代码覆盖率,我无意间在网上找到了gcovr工具。使用之后,觉得这个工具相当的不错,于是便写下这篇文章,可供相关的开发人员参考。
该工具运行在Linux之下,解压后,将scripts目录下的gcovr拷贝到/usr/bin目录下就可以了。
下面以寻找栈的增长方向的FindStackDirection.c程序为例,介绍gcovr的使用方法。
程序源代码为:
1.程序编译及执行
将示例程序上传到Linux机器上,并在程序所在的目录下使用“gcc -fprofile-arcs -ftest-coverage -fPIC -O0 FindStackDirection.c -o FindStackDirection”命令对程序进行编译,生成FindStackDirection.gcno和FindStackDirection文件。
编译命令中的“-fprofile-arcs -ftest-coverage -fPIC”用于产生能够被gcovr命令处理的文件。
接着执行“./FindStackDirection”命令,又生成了FindStackDirection.gcda文件。
2.输出列表形式的代码覆盖率
在程序所在的目录下运行“gcovr -r .”命令,可看到输出结果如下:
这就是代码覆盖率报告,我们可以看到,程序运行之后,覆盖了85%的代码。
3.输出分支覆盖率
在程序所在的目录下运行“gcovr -r . –branches”命令,可看到输出结果如下:
我们可以看到,程序一共有6个分支,执行了其中的4个。
4.输出展示覆盖率的XML文件
在程序所在的目录下运行“gcovr -r . –xml-pretty”命令,可看到输出结果如下:
我们可以看到,命令的执行结果是输出了XML格式的代码覆盖率报告。
5.输出展示覆盖率的HTML文件
在程序所在的目录下运行“gcovr -r . –html -o FindStackDirection.html”命令,可看到在当前目录下生成了FindStackDirection.html文件。用浏览器打开,其内容如下图所示:

这个HTML文件以图形化的方式直观地展示了代码的覆盖率。
我们还可以添加“–html-details”选项为代码工程中的每个文件生成一个独立的web页。例如,我们在程序所在的目录下运行“gcovr -r . –html –html-details -o FindStackDirection2.html”命令,可看到在当前目录下生成了FindStackDirection2.html文件和FindStackDirection2.FindStackDirection.c.html文件。用浏览器打开FindStackDirection2.html文件,其内容如下图所示:
可以看到,页面上的“FindStackDirection.c”文字有一条下划线,单击该文字,出现的一个新的页面,其内容如下图所示:
可以看到,某些代码行前面有数字,表示该行运行的次数。如“if (pStackAddr == NULL)”行运行了2次,“pStackAddr = &iStackAddr;”行运行了1次。
6.更多的gcovr命令
7.总结
如果大家要查看自己所编写的C代码在执行过程中的代码覆盖率,那么gcovr工具就是一个相当不错的选择。
下面是两个网址,大家可以通过它们对gcovr有一个更加深入的了解:
最后再啰嗦几句,gcovr是一个用Python编写的开源软件,大小只有几十KB,但功能强大。让我们一起向开发该软件的前辈们致敬!