Gtest 介绍

来源:互联网 发布:电池健康度软件 编辑:程序博客网 时间:2024/06/01 09:11

q  Install Gtest

 

1. Uncompress install package:  gtest-1.7.0.zip

2. Compile as below:

    g++ -I /home/yinhr/gtest-1.7.0/include -I /home/yinhr/gtest-1.7.0/ -c                 /home/yinhr/gtest-1.7.0/src/gtest-all.cc

    ar -rv libgtest.a gtest-all.o

3. If compile success, it will generate a static library file : libgtest.a    

q  Install Gmock (used to add stub for a function)

1. Uncompress install package: gmock-1.7.0.zip

2.  cd  /make

make

cd .. (go to gmock-1.7.0)   run below command:

g++ -I gtest/include/ -I gtest/ -I include/ -I ./ -c gtest/src/gtest-all.cc  

g++ -I gtest/include/ -I gtest/ -I include/ -I ./ -c src/gmock-all.cc         

ar -rv libgmock.a gtest-all.o gmock-all.o

 

3. If compile success, will generate the static library file : libgmock.a    

v  Comment

    libgmock.a has included the gtest-all.cc which needed by gtest. So we only need link libgmock.a

 

 

 

1. Add path /unitTest and /gtest/inc  in INCLUDE_DIRECTORIES

 2. Add path /unitTest  in AUX_SOURCE_DIRECTORY

 3. Add gtest/lib in link_directories and add gtest in TARGET_LINK_LIBRARIES

 

项目CMakeLists.txt文件要添加头文件和库文件的引用,

#project name

PROJECT(test_gtest)

#head file path

INCLUDE_DIRECTORIES(

     …….

     …….

     ${test_gtest_SOURCE_DIR}/gtest/inc      #添加gtest头文件目录

)

LINK_DIRECTORIES(${test_gtest_SOURCE_DIR}/gtest/lib)  #添加gtest库文件目录

#source directory

AUX_SOURCE_DIRECTORY(${test_gtest_SOURCE_DIR}/src DIR_SRCS)

#add executable file

ADD_EXECUTABLE(testgcc  ${DIR_SRCS})

TARGET_LINK_LIBRARIES(testgcc gmock)   #链接静态库

 

 

SET(SMARTTHINGS_INC   ......

                                  ${SMARTTHINGS_DIR}/smarthome

                                  ${SMARTTHINGS_DIR}/unitTest                

                                  ${SMARTTHINGS_DIR}/gtest/inc)

 INCLUDE_DIRECTORIES(${SMARTTHINGS_INC})

......

AUX_SOURCE_DIRECTORY(${SMARTTHINGS_DIR}/smarthome SMARTHOME_SRC)

AUX_SOURCE_DIRECTORY(${SMARTTHINGS_DIR}/unitTest UNITTEST_SRC)

SET(SMARTTHINGS_SRC  ……   ${SMARTHOME_SRC}

        ${UNITTEST_SRC} )

……

link_directories(/usr/lib/gstreamer-0.10)

link_directories(${SMARTTHINGS_DIR}/gtest/lib)

TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PKGS_LDFLAGS} gtest  gstplayermixer -lm)

 

 

q  Create UnitTest folder

ü   All TC files are in this folder

q     Create gtest folder

ü   All gtest head files and library files are in this folder

 

 

UT的例子

TEST(EVENTMANAGER_SUIT, Register_2)

{   

                  CEventManager* pEventManager = CEventManager::GetInstance();   

                   int nClientId = 1;

                   EXPECT_TRUE(pEventManager>Register(funcCallback,NULL,&nClientId));

}

TEST(EVENTMANAGER_SUIT, SubscribeEvent_1)

{   

                 CEventManager* pEventManager = CEventManager::GetInstance();   

                 int nClientId = 1;   

                pEventManager->Register(funcCallback,NULL,&nClientId);  

                EXPECT_FALSE(pEventManager->SubscribeEvent(nClientId + 1, 1));

}

TEST(EVENTMANAGER_SUIT, SubscribeEvent_2)

{   

                CEventManager* pEventManager = CEventManager::GetInstance();  

                int nClientId = 1;   

                pEventManager->Register(funcCallback,NULL,&nClientId);  

                EXPECT_TRUE(pEventManager->SubscribeEvent(nClientId, 1));

}

 

 

打桩

 

include "CSubscriber.h"

CSubscriber::CSubscriber(int fd)

{

}

              

CSubscriber::~CSubscriber()

{

}

          

int CSubscriber::readBuf(int len)    //待打桩的原函数定义

{

           return 1000;

}

int CSubscriber::writeBuf(int len)

{

           return 2000;

}

 

Foo.h

#ifndef __FOO_H__

#define __FOO_H__

class Cal

{

         public:

                   Cal(void);

                   static int max(int a, int b);

};

#endif

 

Foo.cpp

 

#include "foo.h"

#include "CSubscriber.h"

Cal::Cal(void)

{

}

int Cal::max(int a ,int b)

{

         CSubscriber cs(5);

         cs.readBuf(2000);   //此方法需要打桩

        

         return a > b ? a : b;

}

 

 

 

#include "gtest/gtest.h" 

#include "gmock/gmock.h"

 

using ::testing::AtLeast; 

using testing::Return;

 

class CSubscriber 

         public: 

                   CSubscriber(int fd); 

              

                   virtual ~CSubscriber(); 

          

                  

          

                   //function return: 

                   //0: means complete read, all elements parsed OK 

                   //1: means it need recv more buf, not it's not complete 

                   //-1: means the packet is not valid. 

                   //-2: means connection wrong. 

                  

 

                   int readBuf(int len);

                   int writeBuf(int len);

                   void closeSock();

          

                   //max send buf length 

                   static int m_iSendBufLen; 

          

                   //max recv buf length 

                   static int m_iRecvBufLen; 

 

        

};

 

class CPublisher 

         public: 

                   CPublisher(int fd); 

              

                   virtual ~CPublisher();

                   int readBuf(int len);

                   int writeBuf(int len);

                   void closeSock();

 

};

////////// 需要开发者自己写打桩函数如下:构造一个新的类,继承待打桩函数所属类,为//////////每个方法添加一个MOCK_METHOD1方法,

////////// 参数解释: (函数名,函数返回值(函数参数列表))

 

class MockCSubscriber : public CSubscriber 

         public: 

                   MockCSubscriber(int fd):CSubscriber(fd){} 

                   MOCK_METHOD1(readBuf, int(int len)); 

                   MOCK_METHOD1(writeBuf, int(int len)); 

                   MOCK_METHOD0(closeSock, void()); 

};

 

 

class MockCPublisher : public CPublisher

{

         public:

                   MockCPublisher(int fd):CPublisher(fd){} 

                   MOCK_METHOD1(readBuf, int(int len)); 

                   MOCK_METHOD1(writeBuf, int(int len)); 

                   MOCK_METHOD0(closeSock, void()); 

};

 

 

 

 

UT

 

 

#include "gtest/gtest.h"

#include "gmock/gmock.h"

#include "foo.h"

#include "CSubscriber.h"

 

using ::testing::Return;

 

 

TEST(foo, max)

{

         /*EXPECT_EQ(-1, max(2,-1));

         EXPECT_EQ(3, max(2,3));*/

 

          MockCSubscriber subObj(5);

 

          ON_CALL(subObj, readBuf(1000)).WillByDefault(Return(2)); 

                  

          int returnValue = subObj.readBuf(1000);

 

          EXPECT_EQ (returnValue,Cal::max(2,3));

}

 

int main(int argc, char** argv)

{

         ::testing::InitGoogleMock(&argc, argv);

         return RUN_ALL_TESTS();

}

 

执行以下命令:

cd   /build

cmake  ..

make

执行完成会后,build文件目录里如下,目录里有一个可执行文件testgtest

执行./testgtest

 

 

 

 

§  Primer Guide: http://code.google.com/p/googletest/wiki/V1_6_Primer

§  Advanced Guide: http://code.google.com/p/googletest/wiki/V1_6_AdvancedGuide

§  Sample: http://code.google.com/p/googletest/wiki/V1_6_Samples

http://code.google.com/p/googletest/downloads/list

0 0