1、gcov

1.1 什么是gcov

首先我们要了解什么是gcov,gcov伴随gcc 发布。gcc编译加入-fprofile-arcs -ftest-coverage 参数生成二进制程序,执行测试用例生成代码覆盖率信息。

1.2 如何使用gcov

用GCC编译的时候加上-fprofile-arcs -ftest-coverage选项,链接的时候也加上。
      fprofile-arcs参数使gcc创建一个程序的流图,之后找到适合图的生成树。只有不在生成树中的弧被操纵(instrumented):gcc添加了代码来清点这些弧执行的次数。当这段弧是一个块的唯一出口或入口时,操纵工具代码(instrumentation code)将会添加到块中,否则创建一个基础块来包含操纵工具代码。

gcov主要使用.gcno和.gcda两个文件。
     .gcno是由-ftest-coverage产生的,它包含了重建基本块图和相应的块的源码的行号的信息。
     .gcda是由加了-fprofile-arcs编译参数的编译后的文件运行所产生的,它包含了弧跳变的次数和其他的概要信息(而gcda只能在程序运行完毕后才能产生的)。

1.3 gcov 覆盖分类

  Gcov执行函数覆盖、语句覆盖和分支覆盖。

  举个例子,程序代码由main.c和test.c两个文件组成,编译、链接、运行程序
  编译:gcc -fprofile-arcs -ftest-coverage -o myapp main.c test.c
  运行:./myapp
  然后 输入

gcov main.c,gcov tmp.c

  这个时候当前目录下有了新的文档main.c.gcov,和tmp.c.gcov
  若想保存覆盖率文件,上述命令修改为:
  命令:gcov main.c >>yourfilename,gcov tmp.c >>yourfilename

  而这时候的main.c.gcov,和tmp.c.gcov就包含了函数和代码执行次数的信息,我们可以查看结果:

-:    0:Source:main.cpp
-: 0:Graph:main.gcno
-: 0:Data:main.gcda
-: 0:Runs:1
-: 0:Programs:1
-: 1:#include <iostream>
-: 2:using namespace std;
1: 3:int main()
-: 4:{
-: 5: int i,total;
1: 6: total = 0;
-: 7:
11: 8: for (i=0; i<10; i++)
10: 9: total += i;
-: 10:
1: 11: if (total != 45)
#####: 12: cout << "Failure!" << endl;
-: 13: else
1: 14: cout << "Success!" << endl;
1: 15: return 0;
3: 16:}

  ##### 这就是表示没跑到的

1.4 gcov参数

  关于gcov的参数,可以在linux环境下使用gcov查阅

2、关于lcov

2.1 什么是lcov

  Lcov则是上的gcov 结果展现的一个前端,可以将覆盖率信息转换成html展现。

2.2 生成覆盖率

  前提条件:使用 GCC 以 -fprofile-arcs 和-ftest-coverage 选项编译程序。

  a)假设编译目录名称为 "/root/test/code_cover/",下面有个test.c,然后执行:

gcc -fprofile-arcs -ftest-coverage -o test test.c
./test

  则会在/root/test/code_cover/目录下生成test.gcno和test.gcda文件

  注:一般情况,gcda和gcno会在同一个目录,假如在编译机器上面是test/path,编译的时候会在这个目录下生成*.gcno文件,那么在执行机器上也会生成*.gcda文件在test/path目录下,

如果要使用lcov统计覆盖率,必须将gcno和gcda放在同一个目录,并且有源代码,且源代码的目录和编译时的目录一样,否则不能生成。

  然后cd该目录下执行

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

其中:

  --directory 或者-d 表示的是目录,也就是gcno和gcda目录

  --capture 或者 -c 表示获取覆盖率信息

  --output-file 或者 -o 表示输出文件

  b) 获取 HTML 输出

   genhtml -o results app.info

  results是一个目录,index.html为导航文件,使用 web 浏览器打开 index.html 文件查看代码覆盖结果。

2.3 lcov文件过滤

  在某些情况下,比如三方库不需要统计覆盖率信息,则需要屏蔽,或者只需要某些文件的覆盖率,就需要对文件进行筛选

  a)移除指定目录

lcov --remove all.info '/src/include/*' '/user/bin/*' -o result.info

  此命令表示生成的覆盖率信息,屏蔽 '/src/include/*' '/user/bin/*' 两个目录的覆盖率信息

  all.info  总的覆盖率信息

  result.info 筛选后的覆盖率信息

  b)只要固定目录

lcov  --extract all.info '*/src/*' '*/lib/*' -o result.info

  此命令表示生成的覆盖率信息只要src和lib目录下文件的覆盖率信息

  all.info  总的覆盖率信息

  result.info 筛选后的覆盖率信息

lcov收集覆盖率的更多相关文章

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

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

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

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

  3. 覆盖率測试工具gcov的前端工具_LCOV_简单介绍

    1.Gcov是进行代码运行的覆盖率统计的工具.它随着gcc的公布一起公布的,它的使用也非常easy,须要在编译和链接的时候加上-fprofile-arcs -ftest-coverage生成二进制文件 ...

  4. 我们是如何做go语言系统测试覆盖率收集的?

    工程效能领域,测试覆盖率度量总是绕不开的话题,我们也不例外.在七牛云,我们主要使用go语言构建云服务,在考虑系统测试覆盖率时,最早也是通过围绕原生go test -c -cover的能力来构建.这个方 ...

  5. GCOV&LCOV&GCOVR入门

    索引 一.概述 二.关于gcov的安装 三.代码覆盖率测试(以GCOV为例) 1.编译源代码 2.运行可执行程序 3.通过gcov指令生成代码覆盖率报告 四.生成更全面.直观的代码覆盖率报告 1.LC ...

  6. .NET Core单元测试之搞死开发的覆盖率统计(coverlet + ReportGenerator )

    .NET Core单元测试之搞死开发的覆盖率统计 这两天在给项目补单元测试,dalao们要求要看一下测试覆盖率 翻了一波官方test命令覆盖率倒是有支持了,然而某个更新日志里面写着 ["Su ...

  7. .NET Core单元测试覆盖率统计coverlet配置和使用

    https://segmentfault.com/a/1190000017569492 需要使用: 使用 Moq 测试.NET Core 应用    https://www.cnblogs.com/c ...

  8. EMMA 覆盖率工具

    1. EMMA 介绍 EMMA 是一个开源.面向 Java 程序测试覆盖率收集和报告工具.它通过对编译后的 Java 字节码文件进行插装,在测试执行过程中收集覆盖率信息,并通过支持多种报表格式对覆盖率 ...

  9. 测试覆盖率Emma工具使用

    Emma使用与分析 #什么是Emma EMMA 是一个开源.面向 Java 程序测试覆盖率收集和报告工具.它通过对编译后的 Java 字节码文件进行插装,在测试执行过程中收集覆盖率信息,并通过支持多种 ...

随机推荐

  1. localStorage 便签功能实现

    之前利用localStorage写过手机便签应用,因为蛋疼的换了台三星的屌丝级手机,木 有了测试的工具,没能继续优化维护下去.而在网页上实现便签功能目前来说似乎没有太大 的意义,因为不论是 Firef ...

  2. PAT-乙级-1010. 一元多项式求导 (25)

    1010. 一元多项式求导 (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 设计函数求一元多项式的导数.(注:xn(n为整数)的一 ...

  3. express 3.0.x 中默认不支持layout.ejs的解决方法

    1.第一种方法用include 用<% include 模板名(可不加.ejs) %>的写法,具体如下 <% include header %> //套用布局拆成两部分 hea ...

  4. 16进制字符串转数字(C/C++,VB/VB.net,C#)

    这个问题看是很简单,但是在不同语言中实现的方式却千差万别,如果不知道方法,还真是麻烦,我就是在C#中遇到该问题,让我费了很大的周折,才在msdn查到. 一.16进制字符串转数字      1.C/C+ ...

  5. snoopy(强大的PHP采集类) 详细介绍

    Snoopy是一个php类,用来模拟浏览器的功能,可以获取网页内容,发送表单,可以用来开发一些采集程序和小偷程序,本文章详细介绍snoopy的使用教程. Snoopy的一些特点: 抓取网页的内容 fe ...

  6. Qt之高级网络操作(HTTP/FTP快速上手)Qt之QHttpPart和QHttpMultiPart

    http://blog.csdn.net/u011012932/article/details/52535755 http://blog.csdn.net/u011012932/article/det ...

  7. IntelliJ idea 中使用Git

    1.要使用GitHub,首先你需要下载一个Git(地址:http://windows.github.com/)这里使用的是for Windows,然后安装完成会得到如下的一个目录:

  8. perl next和last

    跳出控制结构:next和last next 和last 操作符运维你在循环中改变程序执行的方向,你可能经常会遇到一些的特殊情况, 碰到这种情况时你希望跳过它,或者像退出循环. 比如当你处理Unix 账 ...

  9. Linux上程序执行的入口--Main

    main()函数,想必大家都不陌生了,从刚开始写程序的时候,大家便开始写main(),我们都知道main是程序的入口.那main作为一个函数,又是谁调用的它,它是怎么被调用的,返回给谁,返回的又是什么 ...

  10. Oracle > count(*) / count(0) / count(1) | order by 1, 2

    select count(*), select count(0), select count(1) from table 在统计表的行数时候,经常用到 select count(*) 然而对于行数很多 ...