gcov覆盖率测试

这里使用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里面文件的内容。

你可能感兴趣的:(工具,file,测试,mysql,引擎,gcc,makefile)