Linux下gcov和lcov代码覆盖率分析(CC++覆盖率在NGINX测
试中的应⽤)
gcov是Linux下GCC⾃带的⼀个C/C++代码覆盖率分析⼯具
使⽤⽅法:在gcc或者g++后⾯添加参数 -fprofile-arcs -ftest-coverage
注意:-fprofile-arcs -ftest-coverage必须同时在编译器和链接器上设置,(makefile⾥⾯可以加在 CFLAGS 和 LDFLAGS上),如果连接的时候出现undefined reference to `__gcov_init' 错误,则还要加上-lgocv
编译成功后运⾏编译好的程序,然后退出程序。程序会在当前⽬录下⽣成*.gcda⽂件。
然后使⽤ gcov *.c 或者gcov *.cpp⽣成代码覆盖信息,这个时候需要将原始代码⽂件*.cpp或者*.c放在*.gcda⽂件⼀个⽬录中。
完成后会⽣成*.c.gcov或者*.v⽂件,⾥⾯包含了代码覆盖信息。
由于*.gcov是⽂字模式的,linux还⾃带了⼀个lcov⼯具,可以帮助我们把⽂字的信息转换成更直观的图形表格模式。
lcov -d . -t '表格名称' -o '⽂件名称.info' -b . -c
此时还没完,这个指令只是输出了⼀个 info 的中间⽂件,要变成html格式的图形⽂件还要下⾯的指令:
genhtml -o 输出⽬录名 ⽂件名.info
这样才会在输出⽬录中⽣成完整的html图形⽂件,⽤浏览器在⽂件⽬录中打开index⽂件就能看到了。
C/C++程序的代码覆盖率统计⼯具⾮常少,与JAVA相⽐开源免费的⼯具更是寥寥⽆⼏,好⽤⼜开源的简直是凤⽑麟⾓。左挑右选最后看中了基于GCOV的LCOV作为NGINX测试的覆盖率统计⼯具。选择LCOV的原因很简单:⼀是适合GCOV是GCC配套的测试覆盖率⼯具;⼆是NGINX是纯C的程序,GCOV对纯C代码的覆盖率展现更加精确;三是LCOV作为GCOV的扩展,能够⽣成直观的HTML的带源码的覆盖率报表。
那么下⾯就来看看,怎么通过LCOV来展现NGINX测试代码覆盖率的情况。
⼀、下载和安装
2、如果你有root权限解压后直接make insall安装到系统的执⾏⽬录,然后在任意地⽅都可以执⾏LCOV⼯具的命令了。
3、如果你没有root或者sudo的权限,也没问题,可以直接在Makefile⾥定义PREFIX变量并指向拥有权限的安装⽬录(例如:
PREFIX=/home/mylcov),然后make install安装到指定的⽬录,通过带路径的命令形式来使⽤LCOV⼯具的命令(例
如:/home/mylcov/lcov …)。
4、GCOV⽆需安装,伴随着GCC和LINUX⼀起发⾏。
⼆、如何统计覆盖率
1、要让LCOV能最后统计并展现出覆盖率,需要在编译被测的NGINX的时候添加⼀些选项,从⽽打开GCOV的代码覆盖率⽀持。 编译选项:-fprofile-arcs -ftest-coverage 链接选项:-lgcov NGINX使⽤autoconf⽣成makefile,我们只需要在configure时加⼊以上的选项,请执⾏以下的命令⾏开启NGINX的代码覆盖率功能。
./configure–with-pcre –with-http_ssl_module –with-cc-opt=”-fprofile-arcs -ftest-coverage” –with-ld-opt=-lgcov标红加粗的部分就是前述的选项。
2、编译安装NGINX并初始化LCOV统计数据 在执⾏完刚才的CONFIGURE命令后,直接make 和make install就把带有统计代码覆盖的NGINX版本安装好了。这个时候会发现在源码的编译⽬录⾥有不少.gcno和.gcda⽂件,.gcno是覆盖率统计的路径弧长⽂件,.gcda是覆盖率⽂件。 我们接下来要做的事情是要将覆盖率的数据初始化,并且今后在每次重新统计覆盖率之前都需要进⾏初始化。在刚才源码的编译⽬录中执⾏lcov –d ./ -z,意思是将当前⽬录(./)下的gcda覆盖率⽂件清空,是覆盖率数据回复到空的状态。
3、启动NGINX执⾏各种各样的测试吧
4、测试执⾏完成,收集覆盖率数据 依然是在NGINX源码编译⽬录下执⾏lcov –b ./ -d ./ -c –o outputfile.info,意思是统计的相对⽬录是当前⽬录,对当前⽬录下的覆盖率数据进⾏采集,并汇总到名为outputfile.info的⽂件中。
linux下gcc编译的四个步骤
5、利⽤汇总的数据⽂件⽣成直观的⽹页形式的带有代码覆盖情况的报告 在outputfile.info所在⽬录下执⾏genhtml outputfile.info,意思是利⽤汇总数据⽂件outputfile.info⽣成⼀些列的⽹页格式的报告。
三、LCOV的优势和弱点
LCOV基于GCOV进⾏测试覆盖率的统计,LCOV本⾝也是为了LINUX内核测试覆盖率⽽⽣的,因此对于LINUX下GCC编译的程序有很好的⽀持,并且通过html形式的报告展现给测试⼈员,结果⾮常直观并且利于分析。LCOV测试的覆盖率的种类也⽐较全⾯,⾏覆盖、分⽀覆盖、函数覆盖。 但是也有令⼈遗憾的地⽅对于以so形式存在的动态链接库⽂件不能给予⽀持,对于完全C++编写的代码的覆盖率统计结果是以C++代码被编译器处理过后的C 形式来统计的,所以覆盖的数据和实际代码展⽰页中的情况略有出⼊,但是仍然可以作为测试覆盖率的参考。 总体来说LCOV对于NGINX这样的纯C的静态编译的程序是能够⾮常好的满⾜代码覆盖率统计的需求的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。