展示C代码覆盖率的gcovr工具简介及相关命令使用示例
最近,因为要展示某项目的单元测试的代码覆盖率,我无意间在网上找到了gcovr工具。使用之后,觉得这个工具相当的不错,于是便写下这篇文章,可供相关的开发人员参考。
简而言之,gcovr是一个将单元测试中的代码覆盖率以多种方式(包括列表方式、xml文件方式、html网页方式等)展示出来的工具,目前最新的版本是3.2。gcovr的下载地址是:https://pypi.python.org/pypi/gcovr/。
该工具运行在linux之下,解压后,将scripts目录下的gcovr拷贝到/usr/bin目录下就可以了。
下面以寻找栈的增长方向的findstackdirection.c程序为例,介绍gcovr的使用方法。
程序源代码为:
/********************************************************************** * 版权所有 (c)2015, zhou zhaoxiong。 * * 文件名称:findstackdirection.c * 文件标识:无 * 内容摘要:寻找栈的增长方向 * 其它说明:无 * 当前版本:v1.0 * 作 者:zhou zhaoxiong * 完成日期:20151218 * **********************************************************************/ #include // 重定义数据类型 typedef unsigned char uint8; typedef signed int int32; // 函数声明 void findstackdirection(void); /********************************************************************** * 功能描述:主函数 * 输入参数:无 * 输出参数:无 * 返 回 值:无 * 其它说明:无 * 修改日期 版本号 修改人 修改内容 * --------------------------------------------------------------- * 20151218 v1.0 zhou zhaoxiong 创建 ***********************************************************************/ int32 main() { findstackdirection(); return 0; } /********************************************************************** * 功能描述:查找栈增长方向 * 输入参数:无 * 输出参数:无 * 返 回 值:无 * 其它说明:无 * 修改日期 版本号 修改人 修改内容 * --------------------------------------------------------------- * 20151218 v1.0 zhou zhaoxiong 创建 ***********************************************************************/ void findstackdirection(void) { uint8 istackaddr = 0; // 用于获取栈地址 static uint8 *pstackaddr = null; // 用于存放第一个istackaddr的地址 if (pstackaddr == null) // 第一次进入 { pstackaddr = &istackaddr; // 保存istackaddr的地址 findstackdirection(); // 递归 } else // 第二次进入 { if (&istackaddr > pstackaddr) // 第二次istackdirection的地址大于第一次istackdirection, 那么说明栈增长方向是向上的 { printf("stack grows up!\n"); } else if (&istackaddr < pstackaddr) // 第二次istackdirection的地址小于第一次istackdirection, 那么说明栈增长方向是向下的 { printf("stack grows down!\n"); } else { printf("bad stack!\n"); } } }
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 .”命令,可看到输出结果如下:
------------------------------------------------------------------------------ gcc code coverage report directory: . ------------------------------------------------------------------------------ file lines exec cover missing ------------------------------------------------------------------------------ findstackdirection.c 14 12 85% 65,73 ------------------------------------------------------------------------------ total 14 12 85% ------------------------------------------------------------------------------
这就是代码覆盖率报告,我们可以看到,程序运行之后,覆盖了85%的代码。
3.输出分支覆盖率
在程序所在的目录下运行“gcovr -r . –branches”命令,可看到输出结果如下:
------------------------------------------------------------------------------ gcc code coverage report directory: . ------------------------------------------------------------------------------ file branches taken cover missing ------------------------------------------------------------------------------ findstackdirection.c 6 4 66% 63,67 ------------------------------------------------------------------------------ total 6 4 66% ------------------------------------------------------------------------------
我们可以看到,程序一共有6个分支,执行了其中的4个。
4.输出展示覆盖率的xml文件
在程序所在的目录下运行“gcovr -r . –xml-pretty”命令,可看到输出结果如下:
.
上一篇: iOS 对象转化为字典
下一篇: 中秋节的习俗你知道几个,中秋节该吃什么