一、概述

代码覆盖率(Code coverage)是衡量软件测试质量的一个重要指标。

它描述了当一个特定的测试套件(test suite)运行时,程序源代码被执行的程度。例如,一些更具体的覆盖率指标有:

  1. Statement Coverage:描述源代码中有哪些代码行被执行,各自被执行了多少次
  2. Branch coverage:一般用于描述if语句/或其它条件语句的各分支的执行情况
  3. Function coverage:顾名思义,描述源代码中有哪些函数被执行了
  4. ······

代码覆盖率测试工具可以帮助我们发现代码中未被测试的部分,

而gcov则是一款和GCC配套发布的[经典]代码覆盖率分析工具(仅仅是对覆盖率信息文件进行分析)。

同为代码覆盖率分析工具,GCOV&LCOV&GCOVR之间的差异:

  • GCOV:与GCC配套,不需要安装,生成纯文本文件
  • LCOV:需要安装,跨平台麻烦,生成HTML页面
  • GCOVR:需要安装,跨平台容易,且指令比LCOV少,生成HTML页面

PS. 不仅仅是C或者C++,GCC所支持的语言它们应该都是支持的,例如说Fortran

二、关于gcov的安装

gcov是随gcc一起发布的,并不需要独立安装,设法装上gcc就OK了。对于WINDOWS系统,通过MinGW安装gcc相关的组件即可使用gcov。而对于Linux系统而言,通常会默认安装gcc,因此一般不需要自己安装。

三、代码覆盖率测试(以GCOV为例)

首先,我们需要通过gcc的编译选项获取覆盖率信息文件(例如每行代码被执行了多少次啊),

这里的“生成覆盖率信息”的步骤对任何一个覆盖率分析工具都是完全一样的,

然后,用gcov收集、分析覆盖率信息文件并生成代码覆盖率报告。

用于演示的C程序源代码(包含一个计算阶乘的函数):

#include <stdio.h>

int factorial(int n);

int main()
{
int result0 = factorial();
int result1 = factorial();
int result2 = factorial(); if (result0 != ) printf("test0 failed, actual=%d.\n", result0);
if (result1 != ) printf("test1 failed, actual=%d.\n", result1);
if (result2 != ) printf("test2 failed, actual=%d.\n", result2); return ;
} int factorial(int n)
{
if (n < ) {
printf("Factorial is defined only for non-negative integer numbers.");
return -;
} if (n > ) {
return n * factorial(n - );
} else {
return ;
}
}

factorial.c

1、编译源代码

要生成覆盖率信息文件,必须添加以下编译选项:

gcc -fprofile-arcs -ftest-coverage factorial.c

将factorial.c编译之后,我们将得到一个被“改造”过的可执行程序a.exe,该程序中包含了一些额外的指令,用于记录程序中每一行被执行的次数。以及一个后缀为.gcno的factorial.gcno文件,它是即将被gcov引用的关键数据文件。

编译选项说明:

  • -ftest-coverage选项:添加记录单行代码执行次数的指令
  • -fprofile-arc选项:添加程序每个分支的检测代码(if或者其它条件语句)

2、运行可执行程序

./a.exe

运行可执行程序之后,我们会得到一个factorial.gcda的文件,它和factorial.gcno一样是即将被gcov引用的数据文件(代码覆盖率信息文件)。

3、通过gcov命令生成代码覆盖率报告

gcov factorial.c
File 'factorial.c'
Lines executed:86.67% of
Creating 'factorial.c.gcov'

执行指令后,gcov会引用之前的数据文件生成一个代码覆盖率报告factorial.c.gcov

$ cat factorial.c.gcov
-: :Source:factorial.c
-: :Graph:factorial.gcno
-: :Data:factorial.gcda
-: :Runs:
-: :Programs:
-: :#include <stdio.h>
-: :
-: :int factorial(int n);
-: :
: :int main()
-: :{
: : int result0 = factorial();
: : int result1 = factorial();
: : int result2 = factorial();
-: :
: : if (result0 != ) printf("test0 failed, actual=%d.\n", result0);
: : if (result1 != ) printf("test1 failed, actual=%d.\n", result1);
: : if (result2 != ) printf("test2 failed, actual=%d.\n", result2);
-: :
: : return ;
-: :}
-: :
: :int factorial(int n)
-: :{
: : if (n < ) {
#####: 21: printf("Factorial is defined only for non-negative integer numbers.");
#####: 22: return -1;
-: : }
-: :
: : if (n > ) {
: : return n * factorial(n - );
-: : } else {
: : return ;
-: : }
-: :}

“#####”所标记的是未被执行的语句。

四、生成更全面、直观的代码覆盖率报告

直接用gcov生成的代码覆盖率报告并不是很直观,因此一般应该都是用以下两款。

1、LCOV

Lcov是gcov的图形化前端,它和GCOV做的工作是差不多的,只不过最后输出的是HTML页面形式的代码覆盖率报告。

Ubuntu系统下安装LCOV:

sudo apt-get install lcov

依然用之前的factorial.c演示。首先,按之前的步骤生成相关数据文件,例如xxx.gcda、xxx.gcno(PS. 不需要用gcov生成xxx.c.gcov文件)。然后,用LCOV收集相关数据并生成一个.info文件(方便起见直接在当前目录执行该命令):

lcov --capture --directory . --output-file coverage.info

最后,通过genhtml将coverage.info转化为HTML文件(genhtml是lcov自带的工具):

genhtml coverage.info --output-directory out

生成的OUT目录里包含了HTML版的代码覆盖率报告。

在WINDOWS上安装LCOV比较繁琐,有人专门写了Windows上可运行的LCOV脚本[LCOV for Windows],但是我下载下来后没弄懂怎么用。

2、GCOVR

相比于LCOV,gcovr可能更方便一点。LCOV有的功能gcovr都有,并且gcovr也是开源的:https://github.com/gcovr/gcovr。它是用Python写的,这意味着只要有Python环境都可以使用gcovr,无论是WINDOWS还是LINUX。直接通过pip(Python的包管理工具)安装GCOVR:

pip install gcovr

还是和之前一样的步骤生成相关的代码覆盖率信息文件,然后直接用gcovr生成HTML代码覆盖率报告就行了:

gcovr -r . --html --html-details -o coverage.html

五、参考

GCOV&LCOV&GCOVR入门的更多相关文章

  1. 【转】gcov lcov 覆盖c/c++项目入门

    原文: http://www.cnblogs.com/turtle-fly/archive/2013/01/09/2851474.html ------------------------------ ...

  2. Eclipse C++,Cygwin 64,gcov,lcov 单体&覆盖率测试环境搭建笔记

    1.下载并安装 Eclipse IDE for C/C++ Developers https://eclipse.org/downloads/packages/eclipse-ide-cc-devel ...

  3. Jenkins中集成Gcov代码覆盖率报告

    最近终于把gcov代码覆盖报告集成到jenkins中了,总算是完成工作,写篇博客总结下. 我循序渐进地用了三个工具:gcov, lcov, gcovr 这三个工具原理(其实gcovr依赖于GNU的gc ...

  4. 代码覆盖工具(gcov、lcov)的使用

    一.安装 gcov:是随gcc一起发布的,并不需要独立安装:lcov:其他博客说是随ltp发布的,结果下载下ltp之后编译了10多分钟,最后也没见lcov,最后到sourceforge下载了lcov单 ...

  5. 嵌入式平台组件白盒测试gcov、lcov和genhtml 使用指导

    在嵌入式平台上使用了gtest白盒测试工具,覆盖了被测函数,但是不知道自己测试的效果如何,测试行覆盖率.函数覆盖率,分支覆盖率的数据. 便开始研究gcov这个代码覆盖率工具能否使用,来检查白盒测试的效 ...

  6. C/C++代码覆盖率统计工具:gcov&&gcovr安装和简单使用

    gcov安装 Linux ver: gcov是gcc的自带功能 属于GNU 不用特别安装 Windows ver: 在windows下安装可以使用gcov的gcc 之前试过mingw和Cygwin64 ...

  7. 覆盖率测试工具gcov的前端工具_LCOV

    http://my.oschina.net/alphajay/blog/33725 1.Gcov是进行代码运行的覆盖率统计的工具,它随着gcc的发布一起发布的,它的使用也很简单,需要在编译和链接的时候 ...

  8. GCOV 使用用例

      1.GCOV查看arm-linux代码覆盖率 一.           关于gcov工具 gcov伴随gcc 发布.gcc编译加入-fprofile-arcs -ftest-coverage 参数 ...

  9. 【C++】统计代码覆盖率(三)

    报告集成到jenkins才是最终目的,因此又进行了部分资料查找,得到html和xml报告集成jenkins的配置如下: 一 集成html报告 这种方式集成在你已经用gcov+lcov生成了html报告 ...

随机推荐

  1. 2019.3.23 python的unittest框架与requests

    (明天学测试用例集合及输出测试报告!!!) import unittest import requests import json class Test_get(unittest.TestCase): ...

  2. iview select filterable属性使用下拉小bug

    今天做项目时候在iview 原生自带的select中设置filterable,下拉时候可进行查询,但是发现选中载打开模态框每次都绑定上一次的值,解决方案就是在关闭弹框时候将this.$refs.sto ...

  3. java_基础_static{}语句块

    static{}语句块会在类被加载的时候当且仅当执行一次,一般用于初始化变量和调用静态方法 Class.forName(“类名”);方法执行时会加载类 外界调用类中静态变量是不会加载类的,也就是说,如 ...

  4. 浅谈 R_S触发器

    1.. 1.要点 就是S R端谁是0谁就掌握了绝对权力,因为与门的缘故. 对于上图 S在左边,所以只要S是0 ,Q必定是1.另外对于R 只要R是0,Q非才能是1,q非又是S端的关键与信号,所以只有R为 ...

  5. 基于hortonworks的大数据集群环境部署流水

    一.ambari及HDP安装文件下载地址: 1.系统 操作系统:CentOS7 2.软件 本次安装采用最新版本: ambari-2.7.0.0 hdp-3.0.0.0 详细信息及下载地址如下: Amb ...

  6. arcengine导出复本

    参考: https://gis.stackexchange.com/questions/172315/creating-checkout-replica-in-arcobjects-from-arcs ...

  7. [ipsec][strongswan] 使用wireshark查看strongswan ipsec esp ikev1 ikev2的加密内容

    一,编译,启用strongswan的save-keys plugin ./configure --prefix=/root/OUTPUT --exec-prefix=/root/OUTPUT --en ...

  8. poj1164

    #include<iostream> using namespace std; ][]; ][]; int roomnum; int maxroom; int m,n; typedef s ...

  9. Jmeter post请求传参问题

    同线程组引用参数 举例1:新增数据bizId,然后将此次新增数据删除 添加新增数据接口,然后查询数据列表,正则表达式提取bizId 在删除接口引用此值${bizId} 添加断言,执行查看结果

  10. Rabbit MQ 消息确认和持久化机制

    一:确认种类 RabbitMQ的消息确认有两种.一种是消息发送确认,用来确认生产者将消息发送给交换器,交换器传递给队列的过程中消息是否成功投递.发送确认分为两步,一是确认是否到达交换器,二是确认是否到 ...