引言:上篇内容讲了c++代码覆盖率工具gcov的原理和结构,本篇内容主要讲C++代码覆盖率测试实践,包括三个阶段:编译阶段、运行程序生成代码覆盖率统计信息、生成可视化覆盖率报告。
一、编译阶段
开启gcov功能,需要在源代码编译参数加入 –fprofile-arcs –ftest-coverage
-ftest-coverage:在编译时产生.gcno文件,它包含了重建基本块图和相应的块的源码的行号信息*
-fprofile-arcs :在运行编译过的程序,会产生.gcda文件,包含基本块弧跳变的次数信息。
如下test.c为例,源码如下:(例子比较简单,只为说明使用流程)
编译代码,运行命令:gcc -fprofile-arcs -ftest-coverage -o test test.c
或者先编译再链接:
编译:gcc -c test.c -ftest-coverage -fprofile-arcs
链接:gcc test.o -o test -lgcov
这样在编译代码目录下就会生成.gcno文件。
如果是make或者scons编译,需要在编译规则中添加–fprofile-arcs –ftest-coverage参数,链接增加–coverage或者-lgcov,链接需要gcov库。
二、运行程序生成代码覆盖率统计信息
运行程序:./test 34
在编译目录下生成 .gcda文件
注:服务器的后台应用程序,不会exit,要在程序入口函数加入退出信号,生成代码执行次数信息,在源码入口添加退出信号如下(亲测可用):
extern “C” void __gcov_flush(void);
void gcov_func(int sig)
{
__gcov_flush();
}
int main()
{
signal(SIGUSR1,gcov_func);
}
三、gcov生成报告
Gcov常用参数:
参数
描述
-a
输出每个基本块的运行计数, 此选项可用于统计在同一行中的若干语句的各自运行次数
-b
输出分支语句频率信息到输出文件, 以及概要信息到标准输出, 但不显示无条件分支
-c
以数字而不是百分比显示分支频率
-n
不创建输出文件
-l
创建的输出文件名中包含头文件名, 这对于头文件中包含代码并被多个源文件使用时有用
-p
在 .gocv 文件名中加入完整的路径信息, 此时路径中的 ‘/’ 用 ‘#’ 表示, ‘…’ 用 ‘^’ 表示
-f
输出每个函数的概要信息
交叉编译:
Gcov要求运行时在目标系统中有相同的编译时的绝对路径,为了支持交叉编译,可以用下面两个环境变量定位数据文件——
环境变量
描述
GCOV PREFIX
指定加入到目标文件中的绝对路径前缀, 默认没有前缀
GCOV PREFIX STRIP
指示要跳过的目录层次
生成代码覆盖率报告:gcov -a -b -c -l -f *.c生成后缀为gcov的测试报告,打开里面的信息:
被标记为 ##### 的代码行就是没有被执行过的, 代码覆盖的信息是正确的,但是报告可读性差, 有另外一个工具叫 lcov,可以用程序最终输出成 html格式的报告。
四、lcov生成报告
1、生成info数据
首先需要安装lcov工具,从官网下载lcov包,笔者用的版本是1.14。下载地址:http://ltp.sourceforge.net/coverage/lcov.php
在编译目录下执行:lcov -c -d . -o test.info --rc lcov_branch_coverage=1
其中:
–directory 或者-d 表示的是目录,也就是gcno和gcda目录
–capture 或者 -c 表示获取覆盖率信息
–output-file 或者 -o 表示输出文件
–rc lcov_branch_coverage=1 生成分支覆盖率
-t “name” 是目标文件,
生成info文件,打开看info文件信息:
一个源文件对应一条记录,记录详细格式如下:
TN: <Test name> 表示测试用例名称,即通过geninfo中的–test-name选项来命名的测试用例名称,默认为空;
SF: <File name> 表示带全路径的源代码文件名;
FN: <函数启始行号>, <函数名>; <函数有效行总数>; <函数有效行总数中被执行个数>
FNDA: <函数被执行的次数>, <函数名>; <函数有效行总数>; <函数有效行总数中被执行个数>
FNF: <函数总数>
FNH: <函数总数中被执行到的个数>
BRDA: <分支所在行号>, <对应的代码块编号>, <分支编号>, <执行的次数>
BRF: <分支总数>
BRH: <分支总数中被执行到的个数>
DA: <代码行号>, <当前行被执行到的次数>
LF: < counts> 代码有效行总数
LH: <counts> 代码有效行总数中被执行到的个数
end_of_record 一条“记录”结束符
2、生成可视化报告
生成HTML报告:genhtml --branch-coverage -o html_report --rc lcov_branch_coverage=1 test.info
其中:
-o 指定生成报告目录
–rc lcov_branch_coverage 生成分支覆盖率
生成的报告信息:
至此,一个漂亮的报告生成了。
Qtest是360旗下的专业测试团队!
是WEB平台部测试技术平台化、效率化的先锋力量!