如何统计测试代码的覆盖率

程序员应该对自己写的代码做好自测试,而自测试的一个有效的手段就是写单元测试或者LLT。对此,可以借助于测试框架,c/c++的如Google Test,CPPUnit; Java的如JUnit等。

在单元测试中,覆盖率是用于衡量测试好坏的指标,能在一定程度上说明测试的完善度。但覆盖率和代码正确率是两码事,覆盖率高并不保证代码写的没bug,这点就不详细展开了。但覆盖率低了,肯定是用例不全。下面进入本文的正题,谈谈覆盖率的原理及以gtest测试框架为例,说明如何统计测试用例的代码覆盖率。

覆盖率统计原理

1. Linux环境下我们可以利用gcc编译源代码,同时编译工具链提供了gcov工具,可以配合gcc产生覆盖信息报告。gcc编译的时候通过增加-fprofile-arcs -ftest-coverage选项,告诉编译器在目标文件中插装跟踪代码,生成供gcov使用的gcno(gcov node)文件(文件后缀为.gcno). 如果是测试的动态库或者静态库的覆盖率的话,则需要在测试用例的g++选项中添加-lgcov选项。

2. 通过运行编译出的目标文件,会生成代码覆盖信息 gcda(gcov data)文件(文件后缀为.gcda),然后使用gcov(或lcov—gcov的延伸版本)对覆盖率进行统计

使用lcov生成覆盖率统计文件:

lcov -d src_dir -t 'tagert' -o 'target.info' -b . -c

一般使用如下的方式即可:

lcov -d src_dir -o target.info -c

命令含义如下: 

  • -d src_dir: 待覆盖率测试的源码目录,此处假设为src_dir
  • -t ‘target’: 目标的名称,可不带引号,此处为target
  • -o ‘target.info’: 生成的覆盖率文件,可自定义,可不带引号
  • -b .:相对目录的起始位置
  • -c: capture,采集覆盖率

有时候需要排除某些目录或者文件(不计算在整体的覆盖率里),可以通过如下命令将文件从target.info中排除

lcov --remove target.info '/path/*' -o target.info 

3. 借助genhtml工具可以生成统计图表

genhtml -o result target.info

生成的result文件夹下提供了html可视化页面,可以点击对应的模块(或文件)查看具体的覆盖率信息

使用gtest+lcov统计C/C++测试代码覆盖率

1. 使用gtest测试框架编写测试用例

2. 将测试用例和待统计的源代码一起编译成一个可执行文件target(需要添加上文中对应的选项),gcno文件【或者使用库方式,如果测试库代码的覆盖率,需要在链接库时增加-lgcov选项;此外,还需要有库中的源文件对应的gcno文件】

3. 运行target文件,得到测试结果(测试用例是否通过)及gcda文件

4. 使用编译出的lcov文件生成覆盖率报告(即上文中提到的target.info)

5. 使用genhtml生成统计图表,打开html页面查看覆盖率信息

 

参考链接:

C++ 测试覆盖率统计轻量方案-gtest+lcov

温故而知新:gtest单元测试工具和lcov覆盖率统计工具的结合使用

gcov、lcov与genhtml 使用心得

嵌入式平台组件白盒测试gcov、lcov和genhtml 使用指导

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值