代码覆盖率测试工具:gcov+lcov
2017-01-10 09:43
2306 查看
概述
gcov是gcc工具链内含的一个选项,用于测试Code Coverage,包含代码行,函数及分支的覆盖率测试。 lcov是LTP对gcov扩展的可视化工具,debian系可直接通过apt-get安装,用于生成html格式的详细报告。
本文仅对gcov+lcov的使用及常用技巧作一个简单介绍。
使用步骤
编译目标代码
测试用户空间代码
在编译时加上两个选项-fprofile-arcs和
-ftest-coverage,如下
gcc -fprofile-arcs -ftest-coverage -o test test.c
编译生成两个文件,可执行目标文件test和test.gcno,可以看到test文件明显大了许多,在此不论述编译器具体做了什么,有兴趣的可以查看gcov的原理。
root:~# gcc -o test test.c
root:~# ls -l test
-rwxr-xr-x 1 root root 7335 Dec 19 23:12 test
root:~# gcc -fprofile-arcs -ftest-coverage -o test test.c
root:~# ls -l test
-rwxr-xr-x 1 root root 22016 Dec 19 23:12 test
测试内核空间代码
打开kernel gcov选项# 在.config中添加
CONFIG_DEBUG_FS=y
CONFIG_GCOV_KERNEL=y
设置测试目标代码
#若测试整个内核,在.config中添加
CONFIG_GCOV_PROFILE_ALL=y
#若测试某一个目录下所有文件,在目录Makefile中添加
GCOV_PROFILE=y
#若测试目录下某几个文件,在目录Makefile中添加
GCOV_PROFILE_file1_name.o=y
GCOV_PROFILE_file2_name.o=y
生成的gcno文件位置为
out/target/***/obj/kernel/***
运行测试
测试过程会生成 "*.gcda" 文件,对于内核代码,gcda文件的位置为/sys/kernel/debug/gcov/$KERNEL_PATH/
生成报告
lcov生成文本格式报告#将gcda和gcno文件放在同一目录下,在该目录下执行
lcov -b <测试代码路径> -d . -c -o result.info --rc lcov_branch_coverage=1
--rc lcov_branch_coverage=1表示包含分支数据,lcov支持很多选项,具体可参考其Manpage
生成的info文件格式如下,包含了代码路径及每一行的调用次数,希望大家不要直接修改这个文件来伪造测试结果
SF:[测试代码路径]
FN:[行号],[函数名]
DA:[行号],[执行次数]
LF:被统计的总行数
LH:被执行的行数
end_of_record
genhtml生成html报告
# 会生成result文件夹,可通过index.html进行查看
genhtml -o result result.info --rc lcov_branch_coverage=1
使用技巧
整合测试结果
将多个测试阶段的报告进行整合,这个功能在测试内核驱动时特别有用,因为有时需要重启进行第二阶段测试,但重启后覆盖率信息将会被重置,就需要将coverage info先保存下来,然后将多个info整合生成最终的报告,如:#测试阶段1完成,pull出gcda文件,生成phase1.info
#重启
#测试阶段2完成,pull出gcda文件,生成phase2.info
#整合phase1.info和phase2.info
lcov -a phase1.info -a phase2.info -o out.info
#生成html报告,为两次测试结果汇总
genhtml -o result out.info
在添加新的测试后,之前的测试不用重新跑过,只需要得到新的测试报告,将报告进行叠加即可。
match错误
在使用lcov生成.info文件时,有时会报match错误,这种情况一般有两种原因gcda与gcno对应的不是同一次build的镜像,可通过如下命令查看,两次tag相同则为同一次编译的,否则只能重新编译测试
$ hexdump -e '"%x\n"' -s8 -n4 usb.gcno
6f88d714
$ hexdump -e '"%x\n"' -s8 -n4 usb.gcda
6f88d714
编译代码的主机与生成报告的主机源码绝对路径不同
修改阈值
genhtml默认:90%+为绿色,75%~90%为黄色,75%以下为红色 我们也可以根据项目要求自定义阈值,lcov/genhtml支持通过 –rc 传输一些配置参数。
其中与阈值相关设置项:
genhtml_hi_limit -> 全局
genhtml_med_limit -> 全局
genhtml_branch_hi_limit -> 分支
genhtml_branch_med_limit -> 分支
genhtml_function_hi_limit -> 函数
genhtml_function_med_limit -> 函数
包含了全局,分支及函数的阈值设置,以单独设置为准。如果你定义了genhtml_hi_limit和genhtml_branch_hi_limit,对branch来说还是以genhtml_branch_hi_limit为准,而line和function则使用全局的设置。所以虽然没有line的单独设置项,也是可以分别设置line,function和branch的阈值。
链接出错
注意链接时需要加上选项 -lgcov,否则会报如下类似错误
undefined reference to `__gcov_init'
有兴趣的查看lcov/genhtml的源码,就是两个perl脚本,一般位置在 /user/local/bin/lcov /user/local/bin/genhtml
相关链接:
Linux平台代码覆盖率测试工具GCOV简介,此博主有一系列gcov相关的博文,且比较详细
相关文章推荐
- 使用XDebug调试及单元测试覆盖率分析
- 测试覆盖率——测试覆盖率工具汇总
- GCOV使用
- GCOV简易使用
- 【转载】gcov 用法 --用于统计代码覆盖率
- java UT,IT覆盖率报告
- c/c++代码覆盖率总结
- 好的测试用例应具备的条件
- 使用EMMA统计Java代码功能测试覆盖率
- 基于VxWorks的嵌入式项目分析及测试,MC/DC测试覆盖率--为您免费测试项目,提升产品质量
- 如何实现嵌入式软件测试的自动化
- 利用代码覆盖率提高嵌入式软件的可靠性
- istanbul cover _mocha命令出错
- Linux平台代码覆盖率测试工具GCOV的前端工具LCOV简介
- emma-maven-plugin 统计java覆盖率插件
- 测试代码覆盖率-GCOV的使用
- Cobertura 统计多模块maven项目测试覆盖率
- 大型c++项目不停止运行获取代码覆盖率
- gcov 使用注意事项