被测类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号店