首页 > 技术 > mac下c++单元测试覆盖率工具gcov

mac下c++单元测试覆盖率工具gcov

2016年5月1日 发表评论 阅读评论

gcov 是 GNU 的代码覆盖率检查工具。它利用编译时的 -fprofile-arcs -ftest-coverage 和链接时的 -lgcov 选项参数生成 .gcno 文件进而通过这些文件统计覆盖率。不过高版本的 mac 使用 clang 编译器,不支持 -lgcov 选项生成 .gcno 文件。为了解决这个问题,我们可以使用-coverage参数来生成 .gcno 文件。例如:

我的g++ --version信息如下
Apple LLVM version 7.3.0 (clang-703.0.29)
Target: x86_64-apple-darwin15.4.0
Thread model: posix
使用-lgcov会报错
ld: library not found for -lgcov

可以使用-coverage选项替换-lgcov

在C/C++中产生代码覆盖率的步骤包括如下几步:
一、设置编译参数
如下来设置Makefile中的编译参数以使之支持覆盖率产生:
ifeq ($(coverage), yes)
CXXFLAGS += -coverage
endif
这样,可以使用 make coverage=yes 来引入这些编译选项而不会影响到正常的编译,比如:
#make coverage=yes
这时候会产生.gcno文件。

二、运行测试程序
#./exe
运行测试程序,会针对所有cpp源代码产生相应的.gcda文件。

三、获取覆盖率数据
获取覆盖率数据的方法很多种,这里介绍两种,分别产生txt和html数据:
1、使用gcov获取文本形式的覆盖率数据
使用gcc自带的覆盖率结果产生工具gcov能产生文本格式(.gcov)的覆盖率结果。
#gcov xxx.cpp
2、使用lcov获取html形式的覆盖率数据
使用IBM的lcov来产生html结果数据,具体如下:
#lcov -c -d ./ -o app.info
#genhtml app.info -o cc_result

四、展示数据
将步骤三中产生的覆盖率数据文件放到Apached的htdocs目录下,就能通过浏览器来查看覆盖率结果了。

五、基本术语
1、行覆盖率(line coverage)
即源代码有效行数与被执行的代码行的比率。
2、分支覆盖率(branch coverage)
即有判定语句的地方都会出现2个分支,整个程序经过的分支与所有分支的比率是分支覆盖率。
3、增量覆盖率(incremental coverage)
即被执行的新增和修改的代码行数与新增和修改的代码总行数的比率。

gcov实际例子,通过运行gtest中的sample1.cc单元测试。

makefile文件的写法

编译程序

编译完成后直接执行gcov命令,会报未执行,需要先执行可执行文件

执行可执行文件

使用gcov查看sample1.cc文件的覆盖率

表示:sample1.cc一共有13行(可执行代码),全部被执行,测试覆盖率100%。
具体哪些代码被测还可以看sample1.cc.gcov文件:

-表示该行不可执行,数字1或其他表示该行被执行了多少次,#####表示代码没被执行。

分类: 技术 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.