前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用gcov和lcov测试代码覆盖率

使用gcov和lcov测试代码覆盖率

作者头像
编程珠玑
发布2019-09-04 16:22:28
4.2K0
发布2019-09-04 16:22:28
举报
文章被收录于专栏:编程珠玑

gcov与 lcov简介

通过gcov和lcov,可以很直观的看到代码的运行情况,同时也可以查看代码的行覆盖率,函数覆盖率等等信息,为开发提供一个方便的测试手段。

gcov

gcov是Linux下GCC自带的一个C/C++代码覆盖率分析工具,因此只要安装了gcc,就不需要再次安装了

lcov介绍

gcov能够生成代码覆盖信息,但是不够直观,因此需要借助lcov直观展示覆盖率,主要特点有:

  • 基于Html输出,并生成一棵完整的HTML树
  • 输出包括概述、覆盖率百分比、图表,能快速浏览覆盖率数据
  • 支持大项目,提供三个级别的视图:目录视图、文件视图、源码视图
lcov安装

下载地址:lcov 下载完成后解压,执行命令:make install即可。 下面简单介绍linux下,使用gcov和locov进行代码覆盖率的测试。

测试

测试代码:
代码语言:javascript
复制
/***************************************************************
*   Copyright (C) 2017 All rights reserved.
*
*   文件名称:test.c
*   创 建 者:hyb
*   创建日期:2017年08月06日
*   描    述:
*
***************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int* twoSum(int* nums, int numsSize, int target) {
    int loop = 0;
    int inloop = 0;
    int* result = NULL;
    result =(int*) malloc(2*sizeof(int));
    memset(result,0,2*sizeof(int));
    printf("numsSize=%d\n",numsSize);
    if(NULL == nums || numsSize==0)
    {
        return result;
    }

    for(loop = 0;loop < numsSize;loop++)
    {
        for(inloop = loop+1;inloop <numsSize;inloop++)
        {
            if(*(nums+loop)+*(nums+inloop) == target)
            {
                if(NULL != result)
                {

                    *result = loop;
                    *(result+1) = inloop;
                }
                return result;
            }
        }
    }
    return result;
}

int main(int arg,char argv[])
{
    int nums[4]={2,7,11,15};
    int target = 9;
    int numsSize = 4;
    int* result = twoSum(nums,numsSize,target);
    printf("index1:%d\nindex2:%d\n",*result,*(result+1));
}
编译
代码语言:javascript
复制
gcc -fprofile-arcs -ftest-coverage test.c -o test

上面的参数-fprofile-arcs -ftest-coverage一定要带上,会生成gcno文件

运行
代码语言:javascript
复制
./test

生成了gcda文件

转换覆盖率信息
代码语言:javascript
复制
lcov -c -o test.info -d .

-c 生成覆盖率信息 -o 生成目标文件 -d 目录 . 当前目录

可能出现的出错:可能会提示out of memory,原因是locv版本过低。

生成html文件
代码语言:javascript
复制
genhtml test.info -o ./output

tst.info 需要生成覆盖率信息的源文件 -o 生成结果目录 最后会有提示如下:

Generating output. Processing file gcov_lcov/test.c Writing directory view page. Overall coverage rate: lines……: 91.3% (21 of 23 lines) functions..: 100.0% (2 of 2 functions) 可以看到output目录下有index.html文件 使用浏览器打开html文件,即可查看覆盖率报告

覆盖率报告分析

gcov

从上图可以看到 整个工程的代码行覆盖率和函数覆盖率,分支覆盖情况。 继续点击test.c,可以看到具体每行是否有跑到。

test.c

褐色表示未跑到过的代码,左侧数字表示跑到的次数。

总结

结合使用gcov和locv,可以比较直观的观察到运行的程序是否按照自己的设计,跑到了对应的代码中。当然对于以上过程,完全可以写成脚本,而无需每一次都进行如此繁杂的操作。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-09-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程珠玑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • gcov与 lcov简介
    • gcov
      • lcov介绍
        • lcov安装
        • 测试
          • 测试代码:
            • 编译
              • 运行
                • 转换覆盖率信息
                  • 生成html文件
                    • 覆盖率报告分析
                    • 总结
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档