去年换工作到一家做交易的公司,动辄都是成百上千万的交易额,核心系统使用C语言开发的,但是没有自动化测试工具。也许上家公司GTest给惯坏了,没有自动化测试总感觉像是在裸奔……于是,利用零散的空余时间,带着一个外包在已有的手工测试工具的基础上,整了一个自动化测试工具出来。工具做好之后,补充了一定数量的测试用例后,开始考虑覆盖率的问题。网上搜索一番,原来gcc自带的gcov/lcov工具包已经实现了覆盖率生成,下面就是一番实践后的一个小结。
1、编译选项:-fprofile-arcs -ftest-coverage
使用上述编译选项编译、链接应用程序。其中,‘ftest-coverage’用以生成.gcno文件,‘fprofile-arcs’用以后续执行应用程序时生成.gcda文件。
2、执行应用程序生成.gcda文件
3、执行'gcov *.c'命令生成.gcov文件
gcov使用前面两步生成的.gcno文件和.gcda文件生成.gcov文件,如有嵌套子目录,则每个目录下的源文件都需要生成.gcov文件。
其实,.gcov文件已经包含了代码的覆盖信息,但不是图形化的数据,看起来不直观,所以需要使用lcov工具以生成图形化的统计数据。
4、执行lcov生成.info文件:
>lcov -d <.gcda文件目录> -o <文件名称.info> -b <.gcno文件路径> -c
//lcov -d . -o 'test.info' -b . --no-recursion -c
*需要生成分支覆盖数据可修改文件'/etc/lcovrc(需要root权限)或~/.lcovrc:lcov_branch_coverage= 1
*如果有嵌套子目录,则每个子目录需要单独生成.info文件,使用如下命令将多个.info文件合并为一个.info文件:
lcov -a 1.info -a 2.info -o all.info
5、执行genhtml生成HTML文件
genhtml -o <输出目录名> <文件名.info>
//genhtml -o result all.info
*整体覆盖率
*单个文件覆盖率
参考:
http://ltp.sourceforge.net/coverage/lcov.php
--2018年7月