您的位置:首页 > 运维架构 > Linux

gcov覆盖率测试

2016-02-03 09:23 555 查看
这里使用gcov工具,gcov是伴随着gcc发布。gcc编译加入-fprofile-arcs -ftest-coverage参数生成二进制程序,执行测试用例生成代码覆盖率信息。

fprofile-arcs参数使gcc创建一个程序的流图,之后找到适合图的生成树。只有不在生成树中的弧被操纵 (instrumented):gcc添加了代码来清点这些弧执行的次数。当这段弧是一个块的唯一出口或入口时,操纵工具代码 (instrumentation code)将会添加到块中,否则创建一个基础块来包含操纵工具代码。gcov主要使用.gcno和.gcda两个文件。

.gcno是由-ftest-coverage产生的,它包含了重建基本块图和相应的块的源码的行号的信息。

.gcda是由加了-fprofile-arcs编译参数的编译后的文件运行所产生的,它包含了弧跳变的次数和其他的概要信息。

gcov执行函数覆盖、语句覆盖和分支覆盖。

Lcov则是上的gcov 结果展现的一个前端,可从 http://ltp.sourceforge.net/coverage/lcov.php 下载。可以将覆盖率信息转换成html
展现。

案例:

测试mysql新引擎的覆盖率

在根目录(sql目录)及引擎目录下修改makefile文件:

CXXFLAGS、LIBS变量加上:-fprofile-arcs -ftest-coverage

LDFLAGS = -rdynamic -lgcov

make clean 

make

//将新的编译文件拷贝到原来的安装目录下(必须先关闭mysql服务)

sudo cp .libs/ha_isearch.* /u01/mysql.isearch/lib/mysql/plugin/

sudo cp sql/mysqld /u01/mysql.isearch/libexec/ -f

//其中.libs目录为存储引擎生成的动态库目录

// /u01/mysql.isearch/lib/mysql/plugin/:为程序安装后的目录

// sql/mysqld 是相对于代码根目录

 

//启动mysql服务,并做一个简单的测试

select ...

//关闭mysql服务,此时在引擎的代码目录下的.libs目录下会生成一个".gcda"文件。

//再将".gcda"与".gcno"文件拷贝到代码目录

执行 gcov *.gcda (这个文件是你想要得到的源文件编译后产生的目标文件.o,一样的前缀名)

此时先显示相关文件的覆盖率情况,并得到源码文件的ha_innodb.cc.gcov文件,该文件就包含了所有路径的覆盖情况

在测试的时候覆盖情况是追加的,这样就不必每次都把之前的测试用例跑一遍。(如果要得到新的结果的话只需要把.gcda文件删除掉就可以了,不要删除.gcno文件(如果删除了它的话就必须重新make clean && make),不需要重新编译)

收集覆盖率数据生成app.info文件:

lcov --directory . --capture --output-file app.info

此时如果成功显示如下内容:

Capturing coverage data from .

Found gcov version: 4.1.2

Scanning . for .gcda files ...

Found 2 data files in .

Processing ha_isearch_la-ha_isearch.gcda

Processing .libs/ha_isearch_la-ha_isearch.gcda

Finished .info-file creation

再将app.info转换为http文件:

genhtml  -o  results  app.info

成功显示如下:

Reading data file app.info

Found 8 entries.

Found common filename prefix "/u01/5.1.48.isearch/mysql-5.1.48"

Writing .css and .png files.

Generating output.

Processing file sql/handler.h

Processing file sql/structs.h

Processing file sql/sql_string.h

Processing file sql/mysql_priv.h

Processing file sql/sql_list.h

Processing file storage/isearch/ha_isearch.h

Processing file storage/isearch/ha_isearch.cc

Processing file /usr/include/stdlib.h

Writing directory view page.

Overall coverage rate:

lines......: 59.3% (407 of 686 lines)

functions..: 33.3% (56 of 168 functions)

branches...: 50.3% (145 of 288 branches)

最后在当前目录下可以看到app.info文件与results文件夹。通过浏览器就可以查看results里面文件的内容。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux