文章目录
0. 概念
代码覆盖率测试反映了测试的广度与深度,量化了测试和开发质量,是十分有必要的。
1. Gcov使用
示例代码:
say.c
#include <stdio.h>
int say(char* what) {
printf("------ %s\n", what);
return 0;
}
main.c
#include <stdio.h>
extern int say(char*);
int main(int argc, const char* argv[]) {
if (argv[1]) {
say("hello");
} else {
say("bye");
}
return 0;
}
1. 直接编译
添加 -fprofile-arcs -ftest-coverage 编译参数编译程序,生成可执行程序和 *.gcno 文件:
PS G:\Gcc> gcc -fprofile-arcs -ftest-coverage -O0 say.c main.c
PS G:\Gcc> wsl
cs@cspc:/mnt/g/Gcc$ ls
a.exe main.c main.gcno say.c say.gcno
2. 数据收集
运行可执行文件,生成 *.gcda :
PS G:\Gcc> .\a.exe
------ bye
PS G:\Gcc> wsl
cs@cspc:/mnt/g/Gcc$ ls
a.exe main.c main.gcda main.gcno say.c say.gcda say.gcno
3. 合成最终的gcov文件
生成了gcda文件后可以使用命令将这些文件合成最终的gcov文件,运行结束后会生成存有具体覆盖率信息的文件*.cpp.gcov:
PS G:\Gcc> gcov main.c .\say.c
.\say.gcno:'main' has arcs to entry block
.\say.gcno:'main' has arcs from exit block
File 'main.c'
Lines executed:80.00% of 5
Creating 'main.c.gcov'
File 'say.c'
Lines executed:100.00% of 3
Creating 'say.c.gcov'
*.cpp.gcov中代码行显示"1"代表有覆盖,"#####"则显示没有覆盖:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a517x6ZK-1635512399351)(C:/Users/cs/Desktop/Snipaste_2021-10-29_20-06-23.jpg)]
2. Gcovr生成报告
Gcovr生成 GCC 代码覆盖率报告。
Gcovr 作为 Python 包提供,可以通过 pip 安装:
pip install gcovr
1. 生成代码覆盖率列表报告
gcovr -r . : 对当前目录递归执行gcove生成代码覆盖率报告
PS G:\Gcc> gcovr -r .
------------------------------------------------------------------------------
GCC Code Coverage Report
Directory: .
------------------------------------------------------------------------------
File Lines Exec Cover Missing
------------------------------------------------------------------------------
main.c 5 4 80% 7
say.c 3 3 100%
------------------------------------------------------------------------------
TOTAL 8 7 87%
------------------------------------------------------------------------------
报告展示程序运行后覆盖了 80% 的代码。
2. 生成分支覆盖率列表报告
gcovr -b -r .:对当前目录递归执行gcove生成分支覆盖率报告
PS G:\Gcc> gcovr -b -r .
------------------------------------------------------------------------------
GCC Code Coverage Report
Directory: .
------------------------------------------------------------------------------
File Branches Taken Cover Missing
------------------------------------------------------------------------------
main.c 2 1 50% 6
say.c 0 0 --%
------------------------------------------------------------------------------
TOTAL 2 1 50%
报告展示了在 main.c 中有一个分支没有执行到。
3. 生成html形式报告
gcovr -r . --html --html-details -o coverage.html
–html : 生成当前目录下所有文件的 HTML summary:
–html-details: 为每个源文件在coverage.html 摘要旁边创建一个HTML 详情报告
HTML summary:
HTML details: