多语言展示
当前在线:921今日阅读:67今日分享:39

如何用googletest写C++单元测试

googletest是一个用来写C++单元测试的框架,它是跨平台的,可应用在windows、linux、Mac等OS平台上。下面,我来说明如何使用最新的1.6版本gtest写自己的单元测试。本文包括以下几部分:1、获取并编译googletest(以下简称为gtest);2、如何编写单元测试用例;3、如何执行单元测试。4、google test内部是如何执行我们的单元测试用例的。
方法/步骤
1

1. 获取并编译gtestgtest试图跨平台,理论上,它就应该提供多个版本的binary包。但事实上,gtest只提供源码和相应平台的编译方式,这是为什么呢?google的解释是,我们在编译出gtest时,有些独特的工程很可能希望在编译时加许多flag,把编译的过程下放给用户,可以让用户更灵活的处理。这个仁者见仁吧,反正也是免费的BSD权限。怎么编译呢?先进入gtest目录(解压gtest.zip包过程就不说了),执行以下两行命令:[cpp] view plaincopy 01.g++ -I./include -I./ -c ./src/gtest-all.cc  02.ar -rv libgtest.a gtest-all.o 之后,生成了libgtest.a,这个就是我们要的东东了。以后写自己的单元测试,就需要libgtest.a和gtest目录下的include目录,所以,这1文件1目录我们需要拷贝到自己的工程中。编译完成后怎么验证是否成功了呢?[cpp] view plaincopy 01.cd ${GTEST_DIR}/make  02.  make  03.  ./sample1_unittest 如果看到:[cpp] view plaincopy 01.Running main() from gtest_main.cc  02.[==========] Running 6 tests from 2 test cases.  03.[----------] Global test environment set-up.  04.[----------] 3 tests from FactorialTest  05.[ RUN      ] FactorialTest.Negative  06.[       OK ] FactorialTest.Negative (0 ms)  07.[ RUN      ] FactorialTest.Zero  08.[       OK ] FactorialTest.Zero (0 ms)  09.[ RUN      ] FactorialTest.Positive  10.[       OK ] FactorialTest.Positive (0 ms)  11.[----------] 3 tests from FactorialTest (0 ms total)  12.  13.[----------] 3 tests from IsPrimeTest  14.[ RUN      ] IsPrimeTest.Negative  15.[       OK ] IsPrimeTest.Negative (0 ms)  16.[ RUN      ] IsPrimeTest.Trivial  17.[       OK ] IsPrimeTest.Trivial (0 ms)  18.[ RUN      ] IsPrimeTest.Positive  19.[       OK ] IsPrimeTest.Positive (0 ms)  20.[----------] 3 tests from IsPrimeTest (0 ms total)  21.  22.[----------] Global test environment tear-down  23.[==========] 6 tests from 2 test cases ran. (0 ms total)  24.[  PASSED  ] 6 tests. 那么证明编译成功了。

2

2.可以编译自己的程序1> 把libgtest.a 放在你自己定义的lib中,如/home/John/myGtest/lib2>把GTest需要的头文件放在你自己定义的头文件中,如/home/john/myGtest/include(头文件只需要从源码中拷贝就可以)3>      $cd /home/john/myGtest          $g++ -I./include your_test.cc-o your_test –L./lib -lgtest -lpthread  (验证ok)(-I参数可以用相对路径,比如头文件在当前目录,可以用-I.来指定。-L参数跟着的是库文件所在的目录名)或者写Makefile文件。

3

3. 示例1 [cpp] view plaincopyprint?01.#include    02.// Returns n! (the factorial of n). For negative n, n! is defined to be 1.   03.int Factorial(int n) {  04.int result = 1;  05.for (int i = 1; i <= n; i++) {  06.   result *= i;  07.}  08.return result;  09.}  10.// Tests factorial   11.TEST(FactorialTest, Negative)  12.{  13.EXPECT_EQ(1, Factorial(-5));  14.EXPECT_EQ(1, Factorial(0));  15.EXPECT_EQ(6, Factorial(3));  16.}  17.int main(int argc, char* argv[])  18.{  19.testing::InitGoogleTest(&argc, argv);  20.return RUN_ALL_TESTS();  21.}

4

4. 示例2首先我们建立自己的测试文件为sample.cpp[cpp] view plaincopy 01.int sample(inta,intb)  02.{  03.if(a==0||b==0)  04.{  05.throw"Don‘t do this";  06.}  07.int c= a%b;  08.if(c==0)  09.return b;  10.return sample(b,c);  11.}  其次写自己测试程序的头文件sample.h01.int sample(int a,int b);  写GTest测试程序为gtestSample.cpp[cpp] view plaincopy 01.#include  02.#include “sample.h”  03.TEST(sampleTest,HandleNoneZeroInput)  04.{  05.EXPECT_EQ(2, sample(4,10));  06.EXPECT_EQ(6, sample(30,18));  07.}  最后写我们相关的Makefile文件[cpp] view plaincopy 01.GTEST_DIR = ..  02.USER_DIR = ../program  03.CPPFLAGS += -I$(GTEST_DIR)/include  04.CXXFLAGS += -g -Wall -Wextra  05.  06.TARGET = sample_unittest  07.OBJ = sample.o gtestSample.o  08.  09.# All Google Test headers.  Usually you shouldn't change this  10.# definition.  11.GTEST_HEADERS = $(GTEST_DIR)/include/gtest/*.h \  12.                $(GTEST_DIR)/include/gtest/internal/*.h  13.CC = g++  14.$(TARGET) : $(OBJ)   15.    $(CC) $(CPPFLAGS) $(CXXFLAGS)  -L../lib -lgtest -lpthread $^ -o $@  16.sample.o : $(USER_DIR)/sample.cpp $(USER_DIR)/sample.h $(GTEST_HEADERS)  17.    $(CC) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/sample.cpp  18.  19.gtestSample.o : $(USER_DIR)/gtestSample.cpp $(USER_DIR)/sample.h $(GTEST_HEADERS)  20.    $(CC) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/gtestSample.cpp  21..PHONY: clean  22.clean:  23.    rm -f $(TARGET) $(OBJ)  执行make./ sample_unittest运行结果:[cpp] view plaincopy 01.Running main() from gtest_main.cc  02.[==========] Running 1 test from 1 test case.  03.[----------] Global test environment set-up.  04.[----------] 1 test from sampleTest, where TypeParam =   05.[ RUN      ] sampleTest.HandleNoneZeroInput  06.[       OK ] sampleTest.HandleNoneZeroInput (0 ms)  07.[----------] 1 test from sampleTest (0 ms total)  08.  09.[----------] Global test environment tear-down  10.[==========] 1 test from 1 test case ran. (0 ms total)  11.[  PASSED  ] 1 test.  Congratulations!

推荐信息