lcov使用方法
安装lcov
代码结构(before)
.
├── CMakeLists.txt
├── code 功能代码
│ ├── hanshu.h
│ └── main.cpp
└── test 测试代码
└── test_hanshu.cpp
3 directories, 4 files
编译测试文件
进入测试文件夹test,编译测试文件
cd ./test
g++ test_hanshu.cpp -o test -fprofile-arcs -ftest-coverage
在编译代码时,需要启用代码覆盖率相关的编译选项。
对于使用gcc编译器的项目,可以添加-fprofile-arcs和-ftest-coverage参数来生成包含代码覆盖率信息的文件。
代码结构
.
├── CMakeLists.txt
├── code
│ ├── hanshu.h
│ └── main.cpp
└── test
├── test
├── test_hanshu.cpp
└── test-test_hanshu.gcno
3 directories, 6 files
g++
后生成文件test
和test-test_hanshu.gcno
.gcno:gcov note文件,由-ftest-coverage编译参数产生,包含重建基本块图和相应块的源码的行号信息。
执行测试文件
./test
代码结构
.
├── CMakeLists.txt
├── code
│ ├── hanshu.h
│ └── main.cpp
└── test
├── test
├── test_hanshu.cpp
├── test-test_hanshu.gcda
└── test-test_hanshu.gcno
3 directories, 7 files
执行./test
后生成文件test-test_hanshu.gcda
.gcda:由加了-fprofile-arcs编译参数的编译后的可执行文件运行产生。包含了弧跳变的次数和其他概要信息(程序运行完毕后才能产生)。
lcov收集代码覆盖率
收集Coverage Data,即.gcda文件中的信息。并写入*.info文件.
lcov --capture --directory ./ --output-file cov.info --rc lcov_branch_coverage=1 --exclude '*/test/*'
参数解释:
--capture 或 -c 告诉 lcov 捕获当前的代码覆盖率数据。
--directory <your_build_dir> 或 -d <your_build_dir> 指定包含编译后带有覆盖信息的文件的目录。
--output-file coverage.info 或 -o coverage.info 指定输出的代码覆盖率数据文件的名称。
--rc lcov_branch_coverage=1 用于启用分支覆盖率的收集。
代码结构
.
├── CMakeLists.txt
├── code
│ ├── hanshu.h
│ └── main.cpp
└── test
├── cov.info
├── test
├── test_hanshu.cpp
├── test-test_hanshu.gcda
└── test-test_hanshu.gcno
3 directories, 8 files
执行lcov
后生成文件cov.info
cov.info
文件内容
TN:
SF:/home/xxx/xxx/code/hanshu.h
FN:3,11,_Z8my_printv
FNDA:1,_Z8my_printv
FNF:1
FNH:1
BRDA:5,0,0,1
BRDA:5,0,1,0
BRF:2
BRH:1
DA:3,1
DA:4,1
DA:5,1
DA:6,1
DA:8,0
DA:10,1
DA:11,1
LF:7
LH:6
end_of_record
TN:
表示测试用例名称, 默认为空。
SF:表示带全路径的源代码文件名。
FN: <函数启始行号>, <函数名>; <函数有效行总数>;<函数有效行总数中被执行个数>。
FNF: <函数总数>
FNH: <函数总数中被执行到的个数>
BRDA: <分支所在行号>, <对应的代码块编号>, <分支编号>,<执行的次数>
BRF: <分支总数>;
BRH: <分支总数中被执行到的个数>。
DA: <代码行号>, <当前行被执行到的次数>
LF: < counts> 代码有效行总数
LH:代码有效行总数中被执行到的个数
genhtml生成代码覆盖率报告
genhtml cov.info --title '覆盖率信息' -o ./result/ --show-details --function-coverage --branch-coverage --legend --highlight --demangle-cpp
参数解释:
--title 或 -t:为生成的 HTML 报告设置标题。你可以通过此参数自定义报告的标题,以便更清晰地标识报告的内容或来源。
--output-directory 或 -o:指定输出目录的路径,即 HTML 报告将被生成的位置。如果目录不存在,genhtml 会尝试创建它。确保你有足够的权限在指定的位置创建和写入文件。
--show-details:在报告中显示详细的覆盖率信息,包括每个函数和每行代码的覆盖情况。这会使报告更加详细,但也可能增加其大小。
--function-coverage:在报告中包含函数覆盖率的统计信息。函数覆盖率表示被测试执行的函数占总函数的比例。
--branch-coverage:在报告中包含分支覆盖率的统计信息。分支覆盖率表示被测试执行的代码分支占总分支的比例。这有助于识别未覆盖的代码路径和潜在的逻辑错误。
--legend:在报告中包含图例,解释不同颜色和高亮表示的含义。这对于初次查看报告的用户特别有用,可以帮助他们理解报告中的数据和可视化元素。
--highlight:使用不同的颜色和高亮来显示源代码中的覆盖和未覆盖行。这有助于快速识别哪些代码已被测试覆盖,哪些代码尚未被覆盖。
--demangle-cpp:对 C++ 符号进行解码,以便在报告中显示人类可读的函数和类名。C++ 编译器通常会对符号进行名称修饰(name mangling),以支持函数重载和模板等特性。解码后的名称更易于理解和阅读。
.
├── CMakeLists.txt
├── code
│ ├── hanshu.h
│ └── main.cpp
└── test
├── cov.info
├── result
│ ├── amber.png
│ ├── cmd_line
│ ├── code
│ │ ├── hanshu.h.func-c.html
│ │ ├── hanshu.h.func.html
│ │ ├── hanshu.h.gcov.html
│ │ ├── index-detail.html
│ │ ├── index-detail-sort-b.html
│ │ ├── index-detail-sort-f.html
│ │ ├── index-detail-sort-l.html
│ │ ├── index.html
│ │ ├── index-sort-b.html
│ │ ├── index-sort-f.html
│ │ └── index-sort-l.html
│ ├── emerald.png
│ ├── gcov.css
│ ├── glass.png
│ ├── index.html
│ ├── index-sort-b.html
│ ├── index-sort-f.html
│ ├── index-sort-l.html
│ ├── ruby.png
│ ├── snow.png
│ └── updown.png
├── test
├── test_hanshu.cpp
├── test-test_hanshu.gcda
└── test-test_hanshu.gcno
5 directories, 31 files
执行genhtml
生成的报告存放在result文件夹中
覆盖率报告
Do not communicate by sharing memory; instead, share memory by communicating.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)