lcov使用方法




安装lcov

linux安装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++后生成文件testtest-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文件夹中




覆盖率报告


posted @   guanyubo  阅读(493)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示