背景

C++工程开发一般包括编码、编译、自测、集成测试几个阶段。其中自测很重要,充分的自测可以发现和解决编码和设计过程中的绝大部分问题。Google 的gtest框架是一种高效的测试框架,利用gtest 框架在自己模块的持续开发完好,就可以自己实现测试驱动开发,达到下面两个目的:
* 快速验证新添功能;
* 回归验证已有功能(保证新的功能不影响已有的功能)

那么,如何高效地搭建自己的gtest 框架呢?

具体步骤

下面总结了几个最主要的步骤:

安装gtest 开发包

yum search gtest
yum install gtest.x·86_64
yum install gtest-devel.x86_64

测试文件中添加头gtest 头文件和gtest main函数

...
#include <iostream>
#include <vector>
#include <gtest/gtest.h>
....
....
using namespace YourClassUpperNameSpace::YourClassNameSpace;
....
....

int main(int argc, char* argv[])
{
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

添加你的测试类

  • 继承gtest基类
class TestYourClass : public testing::Test
{
    ...
}

上面最重要的是实现下面的两个虚函数:

  • 每个test case 启动前的初始化函数:
 virtual void SetUp() {                                          
        std::cout<<"SetUp"<<std::endl;
        // Setup RPC serser and client pair 
        your_service_server.reset(new YourServiceImpl(nullptr));
        your_service_server->Start();                                                 
    }
  • 每个test case 执行完后的清理函数:
 virtual void TearDown()                                         
    {                                                               
        std::cout<<"TearDown"<<std::endl;                           
        your_service_server->Close();                             
    }             

如果需要mock 一些依赖接口,这里有时候还需要先mock 一下依赖接口所在的类:

Class MocYourDependentInterface : public YourDependentInterFace {
    ...
    virtual interface1();
    virtual interface2();
    ...
}

完善你的test case

TEST_F(TestYourClass, Case1)                               
{                                                                   
    int64_t serverid;                                               
    int timeout_ms = 10000;                                         
    :Status status;                                  │

    std::string rpc_server_address = FLAGS_test_machine_ip;   
    ....
}

makefile中添加libgtest 链接

  • 如果使用CMakeList里:
    参考如下格式把gtest 加入到target_link_Libraries里面:
target_link_libraries(dataserver brpc braft gflags gtest protobuf)

  • 如果手动写MakeFile

在链接库里加上 -lgtest

结果展示

[==========] Running 1 test from 1 test case.                       
[----------] Global test environment set-up.                        
[----------] 1 test from TestYourClass                       
[ RUN      ] TestYourClass.Case1