(本人正在參加2015博客之星评选,诚邀你来投票,谢谢:

username=zhouzxi">http://vote.blog.csdn.net/blogstar2015/candidate?username=zhouzxi)

近期,由于要展示某项目的单元測试的代码覆盖率。我无意间在网上找到了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 <stdio.h> // 重定义数据类型
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”命令,可看到输出结果例如以下:

<?

xml version="1.0" ?>
<!DOCTYPE coverage
SYSTEM 'http://cobertura.sourceforge.net/xml/coverage-03.dtd'>
<coverage branch-rate="0.666666666667" line-rate="0.857142857143"
timestamp="1450424892" version="gcovr 3.2">
<sources>
<source>
.
</source>
</sources>
<packages>
<package branch-rate="0.666666666667" complexity="0.0"
line-rate="0.857142857143" name="">
<classes>
<class branch-rate="0.666666666667" complexity="0.0"
filename="FindStackDirection.c" line-rate="0.857142857143"
name="FindStackDirection_c">
<methods/>
<lines>
<line branch="false" hits="0" number="65"/>
<line branch="false" hits="1" number="34"/>
<line branch="false" hits="1" number="35"/>
<line branch="false" hits="1" number="37"/>
<line branch="false" hits="0" number="73"/>
<line branch="false" hits="2" number="76"/>
<line branch="true" condition-coverage="50% (1/2)" hits="1" number="63">
<conditions>
<condition coverage="50%" number="0" type="jump"/>
</conditions>
</line>
<line branch="true" condition-coverage="50% (1/2)" hits="1" number="67">
<conditions>
<condition coverage="50%" number="0" type="jump"/>
</conditions>
</line>
<line branch="false" hits="2" number="52"/>
<line branch="false" hits="2" number="53"/>
<line branch="true" condition-coverage="100% (2/2)" hits="2"
number="56">
<conditions>
<condition coverage="100%" number="0" type="jump"/>
</conditions>
</line>
<line branch="false" hits="1" number="58"/>
<line branch="false" hits="1" number="59"/>
<line branch="false" hits="1" number="69"/>
</lines>
</class>
</classes>
</package>
</packages>
</coverage>

我们能够看到。命令的执行结果是输出了XML格式的代码覆盖率报告。

5.输出展示覆盖率的HTML文件

在程序所在的文件夹下执行“gcovr -r . –html -o FindStackDirection.html”命令,可看到在当前文件夹下生成了FindStackDirection.html文件。用浏览器打开,其内容例如以下图所看到的:

这个HTML文件以图形化的方式直观地展示了代码的覆盖率。

我们还能够加入“–html-details”选项为代码project中的每一个文件生成一个独立的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命令

前面展示了部分经经常使用到的gcovr命令。更具体的gcovr命令及对命令的介绍请參考此文档:http://gcovr.com/guide.pdf

7.总结

假设大家要查看自己所编写的C代码在执行过程中的代码覆盖率,那么gcovr工具就是一个相当不错的选择。

以下是两个网址。大家能够通过它们对gcovr有一个更加深入的了解:

(1) gcovr官网:http://gcovr.com/

(2) 怎样利用gcovr生成代码覆盖率的趋势图:http://www.cnblogs.com/jackyim/p/3772306.html

最后再啰嗦几句,gcovr是一个用Python编写的开源软件,大小仅仅有几十KB。但功能强大。让我们一起向开发该软件的前辈们致敬。

展示C代码覆盖率的gcovr工具简单介绍及相关命令使用演示样例的更多相关文章

  1. 【转载】JMeter学习(一)工具简单介绍

    JMeter学习(一)工具简单介绍 一.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静 ...

  2. JMeter学习工具简单介绍

    JMeter学习工具简单介绍   一.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静态 ...

  3. Linux的简单介绍和常用命令的介绍

    Linux的简单介绍和常用命令的介绍 本说明以Ubuntu系统为例 Ubuntu系统的安装自行百度,或者参考http://www.cnblogs.com/CoderJYF/p/6091068.html ...

  4. 【Unity 3D 游戏开发】Unity3D 入门 - 工作区域介绍 与 入门演示样例

    一. 工作区域具体解释 1. Scence视图 (场景设计面板) scence视图简单介绍 : 展示创建的游戏对象, 能够对全部的游戏对象进行 移动, 操作 和 放置; -- 演示样例 : 创建一个球 ...

  5. 百度地图 Android SDK - 检索功能使用的简单演示样例

    百度地图 SDK 不仅为广大开发人员提供了炫酷的地图展示效果.丰富的覆盖物图层,更为广大开发人员提供了多种 LBS 检索的能力. 通过这些接口,开发人员能够轻松的訪问百度的 LBS 数据,丰富自己的移 ...

  6. 最简单的视音频播放演示样例4:Direct3D播放RGB(通过Texture)

    ===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...

  7. [hadoop系列]Pig的安装和简单演示样例

    inkfish原创,请勿商业性质转载,转载请注明来源(http://blog.csdn.net/inkfish ).(来源:http://blog.csdn.net/inkfish) Pig是Yaho ...

  8. 最简单的视音频播放演示样例5:OpenGL播放RGB/YUV

    ===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...

  9. 最简单的视音频播放演示样例8:DirectSound播放PCM

    ===================================================== 最简单的视音频播放演示样例系列文章列表: 最简单的视音频播放演示样例1:总述 最简单的视音频 ...

随机推荐

  1. XML解析——SAX解析以及更方便的解析工具(JDOM、DOM4J)

    XML主要用于数据交换,HTML则用于显示. 相对于DOM的树形解析,SAX采用的是顺序解析,这种解析方法可以快速地读取XML数据的方式. SAX主要事件: No. 方法 类型 描述 1 public ...

  2. 【2017 Multi-University Training Contest - Team 1 1011】KazaQ's Socks

    [Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6043 [Description] 一个人壁橱里有n双袜子,每天早上取一双最小下标的袜子,然后晚上放 ...

  3. CSUOJ 1603 Scheduling the final examination

    1603: Scheduling the final examination Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 49  Solved: 1 ...

  4. BUFFER OVERFLOW 10 Vulnerability & Exploit Example

    SRC= http://www.tenouk.com/Bufferoverflowc/Bufferoverflow6.html THE VULNERABLE AND THE EXPLOIT     W ...

  5. AVEVA RVM to 3D PDF

    AVEVA RVM to 3D PDF eryar@163.com RvmTranslator 3D PDF plugin can convert PDMS RVM files to 3D PDF w ...

  6. Android自己定义视图(一):带下划线的TextView

    package com.francis.underlinetextviewtest; import android.content.Context; import android.content.re ...

  7. Hbuilder开发app实战-识岁06-face++的js实现【完结】

    前言 因为识岁app比較简单.所以这节就完结吧, 当然另一些能够优化完好的地方,可是个人兴趣不是非常大, 有想继续完好的,源代码在这里:https://github.com/uikoo9/shisui ...

  8. Codefroces 415B Mashmokh and Tokens

    B. Mashmokh and Tokens time limit per test 1 second memory limit per test 256 megabytes input standa ...

  9. 搭建Spark源码研读和代码调试的开发环境

    转载自https://github.com/linbojin/spark-notes/blob/master/ide-setup.md 搭建Spark源码研读和代码调试的开发环境 工欲善其事,必先利其 ...

  10. 辛星跟您玩转vim第三节之程序猿特须要的移动方式

    前面第二节我首先值得一提的是,我的vim教程pdf版本号已经写完了.大家能够去下载,这里是csdn的下载地址:csdn下载.假设左边的下载地址挂掉了.也能够自行在浏览器以下输入例如以下地址进行下载:h ...