使用GCOV和LCOV测试C++代码覆盖率
使用GCOV和LCOV测试C++代码覆盖率
1. GCOV和LCOV简介
GCOV
是一个测试代码覆盖率的工具,可以与GCC
一起使用来分析程序,以帮助创建更高效、更快的运行代码,并发现程序的未测试部分。由于GCOV
是一个命令行方式的控制台程序,需要结合LCOV
前端图形工具才能实现统计数据图形化。
简而言之,GCOV
用于给代码生成覆盖率信息,LCOV
用于生成可视化的代码覆盖率报告。
2. GCOV和LCOV安装
GCOV
一般GCC
自带,不需要下载安装。
以下是LCOV
工具的源码安装方法:
-
解压tar.gz
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
-
添加
LCOV
到PATH
:若在
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")
以如下代码为例,使用GCOV
和LCOV
生成代码覆盖率报告:
// 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就可以看到代码覆盖率数据了。
如下是生成的代码覆盖率报告示例:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本