首页 > 编程语言 >使用GCOV和LCOV测试C++代码覆盖率

使用GCOV和LCOV测试C++代码覆盖率

时间:2024-07-01 11:42:18浏览次数:17  
标签:覆盖率 代码 C++ 生成 GCOV test LCOV

使用GCOV和LCOV测试C++代码覆盖率

目录

1. GCOV和LCOV简介

GCOV是一个测试代码覆盖率的工具,可以与GCC一起使用来分析程序,以帮助创建更高效、更快的运行代码,并发现程序的未测试部分。由于GCOV是一个命令行方式的控制台程序,需要结合LCOV前端图形工具才能实现统计数据图形化。

简而言之,GCOV用于给代码生成覆盖率信息,LCOV用于生成可视化的代码覆盖率报告

2. GCOV和LCOV安装

GCOV一般GCC自带,不需要下载安装。

以下是LCOV工具的源码安装方法:

tar -zxvf lcov-1.14.tar.gz
  • 进入解压后的目录
cd lcov-1.14
  • 在环境变量配置中设置LCOV的安装路径:

    若在bash环境中:

vim .bashrc

# 在bashrc中添加:
export LCOV_HOME=$HOME/LCOV

source .bashrc

​ 若在cshell环境中:

vim .cshrc

# 在cshrc中添加
setenv LCOV_HOME $HOME/LCOV

source .cshrc
  • 编译安装:
make install PREFIX=$LCOV_HOME
  • 添加LCOVPATH

    若在bash环境中:

vim .bashrc

# 在bashrc中添加:
export PATH=$LCOV_HOME/bin:$PATH

source .bashrc

​ 若在cshell环境中:

vim .cshrc

# 在cshrc中添加:
setenv PATH ${LCOV_HOME}/bin:${PATH}

source .cshrc
  • 验证安装是否成功:
lcov --version

3. GCOV+LCOV测试代码覆盖率

使用GCOV生成代码覆盖率数据需要在GCC编译的时候加上参数-fprofile-arcs -ftest-coverage,若项目中使用了CMake,可以在CMakeLists.txt中进行设置:

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")

以如下代码为例,使用GCOVLCOV生成代码覆盖率报告:

// test.c
#include<stdio.h>

int main(int argc, char* argv[])
{
    if(argc > 1)
       printf("AAAA\n");
    else
       printf("BBBB\n");
    return 0;
}
  • 编译时加上参数:
gcc -fprofile-arcs -ftest-coverage test.c -o test 
# 此时将会生成test.gcno文件
  • 执行可执行程序:
./test
# 此时将会生成test.gcda和test.gcno
  • 使用gcov生成代码覆盖信息:
gcov test.c
# 将会生成test.c.gcov的代码覆盖信息,但看起来并不直观
  • 使用lcov生成可视化的代码覆盖信息:
lcov -d . -t "test" -o "test.info" -b . -c
# -d 参数:指定.gcda所在路径
# -t 参数:指定标题
# -o 参数:指定生成的文件名
# -b 参数:指定生成gcno数据时编译的代码路径
# -c 参数:表示生成覆盖率数据
  • 移除某些不需要进行代码覆盖率测试的目录:
lcov --remove test.info "*test*" -o filtered-test.info
# 不测试test目录下的文件
  • 使用genhtml生成html报告:
genhtml -o result filtered-test.info
# -o 参数:指定生成的报告的目录名称

打开生成的报告目录result中的index.html就可以看到代码覆盖率数据了。

如下是生成的代码覆盖率报告示例:

生成的代码覆盖率报告

标签:覆盖率,代码,C++,生成,GCOV,test,LCOV
From: https://www.cnblogs.com/N1rv2na/p/18277742

相关文章

  • 【华为OD机试真题】239、计算疫情扩散时间 | 机试真题+思路参考+代码分析(C++、Java、P
    文章目录一、题目......
  • 【华为OD机试真题】238、贪吃蛇 | 机试真题+思路参考+代码分析(C++、Java、Py、JS)
    文章目录一、题目......
  • C/C++ 运算符相关注意事项
    C/C++中的运算符是编程中不可或缺的一部分,它们用于执行各种算术、逻辑、比较等操作。在使用这些运算符时,需要注意多个方面以确保代码的正确性和效率。以下是对C/C++运算符使用注意事项的总结:1.数据类型匹配与转换算术运算符:注意操作数的数据类型,特别是整数和浮点数之间的......
  • C++文件路径处理3 - 判断指定目录的文件类型(文件夹|普通文件|软连接)
    1.关键词2.filetype.h3.filesystem.h4.filesystem_unix.cpp5.filesystem_win.cpp6.filepath.h7.filepath.cpp8.测试代码9.运行结果10.源码地址1.关键词关键词:C++文件路径处理文件夹普通文件软连接跨平台应用场景:根据指定的目录路径,判断该目录的文......
  • C++Primer Plus 第十四章代码重用:模板类和友元14.4.9 ----002
    C++PrimerPlus第十四章代码重用:模板类和友元14.4.9提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:模板类和友元14.4.9提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录C++PrimerPlus第十四章代码重用:模板类和友元14.4......
  • C++11新特性
    1.字符串原始字面量        在C++11中添加了定义原始字符串的字面量,定义方式为:R“xxx(原始字符串)xxx”其中()两边的字符串可以省略。原始字面量R可以直接表示字符串的实际含义,而不需要额外对字符串做转义或连接等操作。        比如:编程过程中,使用的字符串中......
  • C++11 mem_fn成员指针包装器
    C++11mem_fn成员指针包装器介绍函数模板std::mem_fn生成成员指针的包装器对象,用于存储、复制及调用成员指针。指向对象的引用和指针(包括智能指针)都可以在调用std::mem_fn时使用。注意:std::mem_fn只能包装public的成员指针,不能包装全局函数这里的成员指针指的是成员......
  • C++基础语法——《循环结构》题解
    循环结构参考资料:https://blog.csdn.net/m0_56945138/article/details/118929416需要掌握:1.for循环用法2.while循环用法3.continue跳过和break终止题号题目名称题解链接3067输出范围内的整数https://www.cnblogs.com/jyssh/p/182740551206简单的累加https://www......
  • 【C++】三只小猪称体重
    基于“黑马程序员”视频有关c++学习(p1-p27)完成本节案例学习入口:https://www.bilibili.com/video/BV1et411b73Z?p=28&vd_source=02cd0dc9bea072ad5e681a740632d7a0题目:有三只小猪称体重,分别输入三只小猪的体重,看一下谁最重?分析:先比较任意两只小猪(A)、(B)    如果A......
  • C++ : 如何用C语言实现C++的虚函数机制?
    前言在 googletest的源码中,看到gtest-matchers.h中实现的MatcherBase 类自定义了一个VTable,这种设计实现了一种类似于C++虚函数的机制。C++中的虚函数机制实质上就是通过这种方式实现的,本文用c语言自定义虚函数表VTable实现了一下virtual的功能,来深刻理解其机制。我们通过创......