Gcov单元测试覆盖率

来源:互联网 发布:慈溪行知职高 编辑:程序博客网 时间:2024/04/30 22:13
所谓单元测试覆盖率是指代码的每一行都应该写单元测试覆盖到,所以对于每一个方法都写一个单元测试是必须的,另外, 如果该方法中存在众多的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_COVcov-reset:    @rm -fr coverage    @find . -name "*.gcda" -exec rm {} \;    @lcov --directory . --zerocounterscov-report:    @mkdir -p coverage    @lcov --compat-libtool --directory . --capture --output-file coverage/app.info      @genhtml -o coverage/ coverage/app.info cov:    @make cov-reportclean-local:    @make cov-reset check:    @make covendif    





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

  • Googletesthttp://code.google.com/p/googletest/


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

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