Google Test(GTest)和Google Mock(GMock)入门简介

Google Test


1. 自定义错误输出:

ASSERT_EQ(x.size(), y.size()) << "Vectors x and y are of unequal length";

for (int i = 0; i < x.size(); ++i) {
  EXPECT_EQ(x[i], y[i]) << "Vectors x and y differ at index " << i;
}

2. ASSERT_* 与EXPECT_*系列的区别:

ASSERT_TRUE(condition)ASSERT_FALSE(condition)ASSERT失败导致当前case终止
EXPECT_TRUE(condition)EXPECT_FALSE(condition)EXPECT失败,打印错误,并继续执行当前case
在GTest中,二者的称呼为:Fatal assertion, Nonfatal assertion

什么时候用ASSERT,什么时候用EXPECT呢?一般性的原则是,当你希望程序出错后继续运行,以便让代码暴露出更多的潜在错误的时候,使用EXPECT。当你认为某处出错后继续运行没有意义的时候,使用ASSERT。例如,某个对象如果为NULL,后面对它的引用会导致null pointer error,那么最好还是用ASSERT_NE(NULL, obj)。




3. 比较运算符

ASSERT_*, EXPECT_*都有:

ASSERT_EQ, ASSERT_NE,ASSERT_LT,ASSERT_GT,ASSERT_LE,ASSERT_GE

EXPECT_EQ, EXPECT_NE,EXPECT_LT,EXPECT_GT,EXPECT_LE,EXPECT_GE

另外,GTEST还支持STRING的比较。相关函数有(以ASSERT为例)

ASSERT_STREQ,ASSERT_STRNE,ASSERT_STRCASEEQ,ASSERT_STRCASENE


4. TEST与TEST_F之间的区别

TEST_F比TEST强一些的地方在于TEST_F实际上会生成一个新类,该类有SetUp和TearDown函数用于建立和销毁数据结构。

同一个TestCase文件中不能混合使用TEST与TEST_F。

For each test defined with TEST_F(), Google Test will:

  1. Create a fresh test fixture at runtime
  2. Immediately initialize it via SetUp() ,
  3. Run the test
  4. Clean up by calling TearDown()
  5. Delete the test fixture. Note that different tests in the same test case have different test fixture objects, and Google Test always deletes a test fixture before it creates the next one. Google Test does not reuse the same test fixture for multiple tests. Any changes one test makes to the fixture do not affect other tests.


Google Mock

GoogleMock是个很强大的东西,测试一个模块的时候,可能涉及到和其他模块交互,可以将模块之间的接口mock起来,模拟交互过程。


1. Makefile里面需要加入 -lgmock才能正常连接

 AM_LDFLAGS=-lpthread -lc -lm -lrt -lgtest -lgmock 


2. 可以手工生成Mock类,也可以使用脚本生成

手工:


class ObProject: public ObSingleChildPhyOperator
{   
   public:
        ObProject();
        virtual ~ObProject();
        void reset(){};


        int add_output_column(const ObSqlExpression& expr);
        virtual int open();
        virtual int close();
        virtual int get_next_row(const common::ObRow *&row);
        virtual int64_t to_string(char* buf, const int64_t buf_len) const;
        ....
 };

class MockObProject : public ObProject

{
  public:
  MOCK_METHOD0(open, int());
  MOCK_METHOD0(close, int());
  MOCK_METHOD1(add_output_column, int(const ObSqlExpression &expr));
};

脚本:

需要mock ob_ms_tablet_location_proxy.h中的ObMergerLocationCacheProxy类,方法如下:

 gmock_installed_dir/scripts/generator/gmock_gen.py ob_ms_tablet_location_proxy.h ObMergerLocationCacheProxy

3. 一个类中,只有virtual的member funciton能被mock(试验得到的结论),调用被mock的member function,function行为变成mocked behavior,调用类中没有被mock的member function,function行为与原类相同,不被mock改变。

ps,写了一个简单类,不是virtual居然也能被mock,奇怪。。。。在一个复杂类中,必须是virtual的才能被mock。 这些是实验得到的结论。

从理论上分析,应该必须是virtual才可以。所以,确定哪些函数要被mock,然后在头文件中将其virtual化。不然可别说我没有预先告诉你哦;)


4. 一个被Mock的函数,如果没有在EXPECT_CALL中指定expected behavior,系统将会为其指派默认行为(什么都不做,返回0),并且在屏幕上打印WARNING:

GMOCK WARNING:
Uninteresting mock function call - returning default value.
    Function call: get_next_row(@0x7fff51a6b888 0x30c51529e0)
          Returns: 0
Stack trace:






  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值