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 |
什么时候用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:
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
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: