单元测试(unit test)是一种白盒测试,它是开发人员对自己编写的代码所做的测试。所谓白盒测试,就是浏览并测试代码的各个部分和分支。一般它需要开发人员自己写一些测试代码,来调用被测代码的接口,并通过测试结果来判断被测代码是否正确工作。下面是一个简单的例子。
被测类A的声明:
被测类A的定义:
测试代码:
linux下的make文件是:
编译运行后的结果是:
我们知道A::Sum函数的第一个用例测试通过了,但这时我们并不知道A.cpp当中哪些代码被测过,哪些代码没有被测过,也不知道代码覆盖率(虽然对于目前这个简单的程序肉眼是可以看出来,A::Sum函数被测,A::Multiply函数没被测,但如果被测代码非常复杂,函数之间的嵌套调用很多,函数的处理分支如if判断和while, for循环等也很多,那么就很难以人工判断哪些分支被测,哪些没被测。而且,测试代码是动态运行的)。
在linux平台下,我们可以利用系统工具gcov来实现这一点。这需要改写make文件如下:
注意到不同了吗?编译时增加了选项"
-ftest-coverage"
,链接时增加了"
-lgcov",运行时增加了命令:
gcov -o A.o A.cpp。
运行结果是:
gcov给我们报出来代码覆盖率:
Lines executed:50.00% of 4
其意思是:A.cpp一共有4行(可执行代码),被测了50%。
具体哪些代码被测还可以看A.cpp.gcov文件:
-表示该行不可执行,数字1或其他表示该行被执行了多少次,#####表示代码没被执行。从中我们可以看出函数Multiply没被执行,这是对的,它确实没有被测试代码所执行。
《返璞归真--UNIX技术内幕》在全国各大书店及网城均有销售:
京东
亚马逊 China pub
上学吧 1号店
被测类A的声明:
点击(此处)折叠或打开
- //A.h
- #ifndef _A_H_
- #define _A_H_
- class A
- {
- public:
- int Sum(int a, int b);
- int Multiply(int a, int b);
- };
- #endif
被测类A的定义:
点击(此处)折叠或打开
- //A.cpp
- #include "A.h"
- #include stdio.h>
- int A::Sum(int a, int b)
- {
- return a+b;
- }
- int A::Multiply(int a, int b)
- {
- return a*b;
- }
测试代码:
点击(此处)折叠或打开
- //Main.cpp
- #include stdio.h>
- #include stdlib.h>
- int main(int argc, char *argv[])
- {
- A a;
- int result=a.Sum(5, 6);
- if(result != 11)
- {
- printf("Sum test failed!\n");
- exit(-1);
- }
- printf("Sum test passed!\n");
-
- return 0;
- }
点击(此处)折叠或打开
- OBJS= Main.o A.o
- UTest.out: $(OBJS)
- g++ -o UTest.out $(OBJS)
- CURDIR=$(shell pwd)
- $(OBJS): %.o: %.cpp
- g++ -I$(CURDIR) -c -g $ -o $@
- #unit test
- UT:UTest.out
- ./UTest.out
- .PHONY: clean
- clean:
- rm -f *.o UTest.out
编译运行后的结果是:
点击(此处)折叠或打开
- [root@tivu25 utcov]# make UT
- g++ -I/home/haoqf/src/UTest/utcov -c -g Main.cpp -o Main.o
- g++ -I/home/haoqf/src/UTest/utcov -c -g A.cpp -o A.o
- g++ -o UTest.out Main.o A.o
- ./UTest.out
- Sum test
我们知道A::Sum函数的第一个用例测试通过了,但这时我们并不知道A.cpp当中哪些代码被测过,哪些代码没有被测过,也不知道代码覆盖率(虽然对于目前这个简单的程序肉眼是可以看出来,A::Sum函数被测,A::Multiply函数没被测,但如果被测代码非常复杂,函数之间的嵌套调用很多,函数的处理分支如if判断和while, for循环等也很多,那么就很难以人工判断哪些分支被测,哪些没被测。而且,测试代码是动态运行的)。
在linux平台下,我们可以利用系统工具gcov来实现这一点。这需要改写make文件如下:
点击(此处)折叠或打开
- OBJS= Main.o A.o
- UTest.out: $(OBJS)
- g++ -o UTest.out $(OBJS) -lgcov
- CURDIR=$(shell pwd)
- $(OBJS): %.o: %.cpp
- g++ -I$(CURDIR) -c -g -fprofile-arcs -ftest-coverage $ -o $@
- #unit test and code coverage check
- UT:UTest.out
- ./UTest.out
- gcov -o A.o A.cpp
-
- .PHONY: clean
- clean:
- rm -f *.o *.gcno *.gcda *.gcov UTest.out
gcov -o A.o A.cpp。
运行结果是:
点击(此处)折叠或打开
- [root@tivu25 utcov]# make UT
- g++ -I/home/haoqf/src/UTest/utcov -c -g -fprofile-arcs -ftest-coverage Main.cpp -o Main.o
- g++ -I/home/haoqf/src/UTest/utcov -c -g -fprofile-arcs -ftest-coverage A.cpp -o A.o
- g++ -o UTest.out Main.o A.o -lgcov
- ./UTest.out
- Sum test passed!
- gcov -o A.o A.cpp
- File 'A.cpp'
- Lines executed:50.00% of 4
- A.cpp:creating 'A.cpp.gcov'
Lines executed:50.00% of 4
其意思是:A.cpp一共有4行(可执行代码),被测了50%。
具体哪些代码被测还可以看A.cpp.gcov文件:
点击(此处)折叠或打开
- -: 0:Source:A.cpp
- -: 0:Graph:A.gcno
- -: 0:Data:A.gcda
- -: 0:Runs:1
- -: 0:Programs:1
- -: 1:#include "A.h"
- -: 2:#include stdio.h>
- -: 3:
- -: 4:
- 1: 5:int A::Sum(int a, int b)
- -: 6:{
- 1: 7: return a+b;
- -: 8:}
- -: 9:
- #####: 10:int A::Multiply(int a, int b)
- -: 11:{
- #####: 12: return a*b;
- -: 13:}
《返璞归真--UNIX技术内幕》在全国各大书店及网城均有销售:
京东
亚马逊 China pub
上学吧 1号店