Gcov单元测试覆盖率

所谓单元测试覆盖率是指代码的每一行都应该写单元测试覆盖到,所以对于每一个方法都写一个单元测试是必须的,另外, 如果该方法中存在众多的if 语句分支,也应该在单元测试中覆盖到。

C的世界中,可以用gcov工具计算覆盖率,它会运动每一个单元测试,然后统计代码每一行的执行情况,gcov是最初用来测试linux内核的覆盖率的,是一个命令行工具。可以用lcov,它在gcov的基础上增加了GUI支持。

1 安装lcov

# wgethttp://downloads.sourceforge.net/ltp/lcov-1.9.tar.gz

# tar -zxvf lcov-1.9.tar.gz

# cd lcov-1.9

# make install

2 分步运行一个例子

test.c的代码如下:

#include <stdio.h>

#include <stdlib.h>

int main(int argc, char * argv[]) {

int i = 0;

printf("Begin Test...\n");

if (1 == argc) {

printf("argc == 1\n");

} else {

printf("argc != 1\n");

for (i = 0; i < argc; i++)

printf("%d\tof\t%d\n", i+1, argc);

}

printf("End Test!\n");

}



第一步:编译时要添加-fprofile-arcs-ftest-coverage 参数

gcc test.c -fprofile-arcs -ftest-coverage -o test



第二步:运行测试用例

[hua@zhanghua test]$ ./test 1 2 3 4

Begin Test...

argc != 1

1 of 5

2 of 5

3 of 5

4 of 5

5 of 5

End Test!



第三步:上一步已经生成了统计数据,但不容易看, 现在使用lcov收集统计数据做成图形化显示的

lcov --capture --directory . --output-file test.info--test-name test

lcov –zerocounters (计算器清零)





第四步:生成html网页

genhtml test.info --output-directory output --title "asimple test" --show-details --legend

3 运行lcov自带例子

自带例子位于:$lcov/example目录下,如下:

[hua@zhanghua example]$ ll /bak/xue/unittest/lcov-1.9/example/

total 28

-rw------- 1 hua hua 316 Aug 6 2010 descriptions.txt

-rw------- 1 hua hua 1439 Aug 6 2010 example.c

-rw------- 1 hua hua 108 Aug 6 2010 gauss.h

-rw------- 1 hua hua 118 Aug 6 2010 iterate.h

-rw------- 1 hua hua 2482 Aug 6 2010 Makefile

drwx------ 2 hua hua 4096 Aug 6 2010 methods

-rw------- 1 hua hua 156 Aug 6 2010 README

查看README文件,可以知道通过下列命令运行例子:

make output

4 Makefile集成

在编译阶段需要加入2个编译选项,如下

l编译的时候,增加-fprofile-arcs-ftest-coverage或者--coverage

l链接的时候,增加-ftest-coverage或者–lgcov

l建议打开–g3选项,去掉-O2以上级别的代码优化选项;

一点需要注意的是,上述几个选项的使用不能影响到正常的编译过程,否则会极大地影响程序的运行效率。建议使用makefile参数或者scons的编译参数来编译,

ifeq($(coverage), yes)

CXXFLAGS+= -fprofile-arcs -ftest-coverage

LINKERCXX+= -fprofile-arcs -ftest-coverage

OPT_FLAGS= -g

endif

这样,可以使用makecoverage=yes check来引入这些编译选项而不会影响到正常的编译。



if ENABLE_COV
cov-reset:
    @rm -fr coverage
    @find . -name "*.gcda" -exec rm {} \;
    @lcov --directory . --zerocounters

cov-report:
    @mkdir -p coverage
    @lcov --compat-libtool --directory . --capture --output-file coverage/app.info  
    @genhtml -o coverage/ coverage/app.info 

cov:
    @make cov-report

clean-local:
    @make cov-reset 

check:
    @make cov

endif    





makefile里面可以加在CFLAGSLDFLAGS上),如果连接的时候出现undefinedreference to `__gcov_init'错误,则还要加上-lgocv,编译成功后运行编译好的程序,然后退出程序。



Glib集成gcov的一个例子:

http://code.google.com/p/google-highly-open-participation-gnome/issues/detail?id=37



5 googletest写单元测试

Googletest简称gtest


玩转Google开源C++单元测试框架GoogleTest系列(gtest)()

http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值