gcov c++代码覆盖率测试工具(实践篇)


引言:上篇内容讲了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平台部测试技术平台化、效率化的先锋力量!