• 使用gtest和lcov测试代码覆盖率


    一、gtest安装

    1、源码下载安装,地址如下
    https://github.com/google/googletest/tree/release-1.12.0
    参考readme的步骤
    cd googletest
    mkdir build
    cd build
    cmake …
    make
    sudo make install
    注意:若是在CentOS系统安装,官网有如下提醒,需要devtoolset-7工具链。
    在这里插入图片描述
    We require the devtoolset-7 toolchain (compiler, linker, build tools, etc.) on RHEL 7 and CentOS 7.
    以CentOS系统为例,需要先执行以下命令安装devtoolset-7,然后再安装googletest。

    sudo yum install centos-release-scl
    sudo yum install devtoolset-7
    scl enable devtoolset-7 bash
    
    • 1
    • 2
    • 3

    2、命令直接安装

    sudo apt-get install libgtest-dev
    
    • 1

    安装完成后安装路径如下
    在这里插入图片描述

    二、lcov安装

    gcov是gnu工具集自带的工具,用来统计代码覆盖率,不过只有文本信息, lcov 工具可以理解成 gcov 工具的前端,根据 gcov 的数据生成可视化的报告,可以直观的看代码覆盖率。

    1、进入https://ltp.sourceforge.net/coverage/lcov.php下载安装包
    2、运行如下命令安装

    tar xzvf lcov-1.14.tar.gz
    cd  lcov-1.14
    make install
    
    • 1
    • 2
    • 3

    三、编译配置

    在makefile中增加如下库和两个参数选项

    LIBS += -lgtest
    CFLAGS +=-fprofile-arcs  -ftest-coverage
    
    • 1
    • 2

    四、编译执行

    make 命令编译后, 会为每个源文件生成.gcno结尾的文件
    编译后生成可执行文件demo,运行 ./demo,运行后,会为每个源文件,生成gcda结尾的文件

    五、生成成图形化显示数据

    1、lcov -c -d . -o test.info --rc lcov_branch_coverage=1

    -c :捕捉覆盖率数据
    -d :表示的是目录,也就是gcno和gcda目录。使用lcov统计覆盖率,必须将gcno和gcda放在同一个目录,并且有源代码,且源代码的目录和编译时的目录一样,否则不能生成。
    -o :表示输出文件,以.info结尾,用来存储数据
    lcov在1.10版本后默认关闭分支覆盖率,想要打开,需要加上–rc lcov_branch_coverage=1和–branch-coverage,统计分支覆盖率

    若将usr下的库包含在内,则运行下面命令删掉该目录
    lcov -r test.info “/usr/*” -o test.info --rc lcov_branch_coverage=1
    在这里插入图片描述
    在这里插入图片描述
    2、genhtml --branch-coverage -o result test.info,result目录下生成如下内容

    六、使用浏览器打开index.html查看函数覆盖情况

    行覆盖率(line coverage):描述有多少比例的代码行经过了测试。
    函数覆盖率(function coverage):描述有多少比例的函数经过了测试。
    分支覆盖率(branch coverage):描述有多少比例的分支(例如:if-else,case语句)经过了测试。

    进入每个文件夹函数查看具体函数:
    分支覆盖情况详细介绍如下:
    中括号代表生成的一对子分支,+代表该子分支被覆盖,-代表该子分支未覆盖,但对应的另一分支被覆盖,#代表两个子分支均未被覆盖。 以if(condition)为例,如果该condition没有子条件,即不是其他条件"与"、"或"产生,那么会产生两个分支,即condition== true 和 condition== false,若只能满足condition== true 或false,则分支覆盖结果为[+ -]或[- +],如果多次调用时condition== true 或false都能满足,则分支覆盖结果为[+ +]。如果condition == true或false都不能发生,那么覆盖结果为[# #](虽然在最简单的条件下这个结果并不会发生)。
    行覆盖情况详细介绍如下: 如果该行代码被覆盖到,则其底色为蓝色,没有被覆盖到,则底色为橙色。

    七、错误解决

    使用lcov生成.info文件的时候,出现了如下错误:
    Can’t locate Digest/MD5.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/local/bin/geninfo line 58.
    解决办法:
    执行安装perl-Digest-MD5的命令:
    yum -y install perl-Digest-MD5

  • 相关阅读:
    TCP/IP五层协议栈(2)
    java springboot mqtt控制海康摄像头
    【大数据】Hadoop在呼唤Hive(附一键部署Hive脚本)
    Latex如何隐藏图片
    污水处理工程公司怎么选
    基于Springboot+vue的校园社团管理系统(Java毕业设计)
    【嵌入式项目应用】__一款简单易用的嵌入式软件程序框架_时间片轮询框架
    DETR纯代码分享(八)position_encoding.py(models)
    SpringBoot——静态资源及原理
    论文翻译:2023_THLNet: two-stage heterogeneous lightweight network for monaural speech enhancement
  • 原文地址:https://blog.csdn.net/lansebingxuan/article/details/127647296