Tips
ASSERT_*
与EXPECT_*
- 语义:在检查条件失败时,
ASSERT_*
会导致程序异常退出,而EXPECT_*
会继续执行 - 使用场景:
ASSERT_*
适用于断言测试程序的前置条件,例如 server 有没有正常启动,在这种情况下后续的测试都没有意义EXPECT_*
适用于对后置结果的检查,依次检查实际结果与预期是否相符,如果有多个不符的检查,会依次打印出来而不需要多次执行测试
- 更多检查条件见:Assertions References
- 语义:在检查条件失败时,
断言某个 mock 函数的执行次数:
EXPECT_CALL(foo, Bar(_)).Times(n)
断言foo.Bar
被执行了 n 次- 支持任意次数:
AnyNumber()
- 支持次数范围:
AtLeast(n)
即>=n
次
- 支持任意次数:
断言 mock 函数的参数取值:
Matcher
,参考 Matchers References- 断言字段:
Filed(&class::field, m)
- 断言容器:
- 是非为空
IsEmpty
- 是否包含某个元素
Contains
- 是否是另一个集合的自己或超集
IsSubsetOf
&IsSupersetOf
- 是非为空
- 断言字符串取值:
- 正则
ContainsRegex
- 以某些内容起始或结束:
StartsWith
&EndsWith
- 正则
- 断言字段:
创建 Mock class:
MOCK_METHOD(ReturnType, MethodName, (Args ...))
自定义 Mock function 行为:
EXPECT_CALL(...).WillReatly(Invoke(...))
在测试前后执行逻辑:
TEST_F SetUp/TearDown
一个例子
class Foo {
public:
...
virtual void SetTimeOut(int t);
protected:
virtual void Resume();
private:
virtual int GetTimeOut();
};
class MockFoo : public Foo {
public:
...
MOCK_METHOD(bool, Transform, (Gadget* g), (override));
// The following must be in the public section, even though the
// methods are protected or private in the base class.
MOCK_METHOD(void, Resume, (), (override));
MOCK_METHOD(int, GetTimeOut, (), (override));
MOCK_METHOD(void, SetTimeOut, (_), (override));
};
TEST(FooTest, Example) {
Foo foo = new MockFoo();
// 直接 mock 返回固定结果
EXPECT_CALL(foo, GetTimeOut()).WillRepeatly(Return(10));
// mock function 执行自定义逻辑
EXPECT_CALL(foo, Resume()).WillRepeatly(Invoke([](){ printf("call Resume"); }));
foo.Resume();
// 检查 mock function 调用次数
EXPECT_CALL(foo, Resume()).Times(1);
EXPECT_EQ(10, foo.GetTimeOut());
foo.SetTimeOut(10);
// 检查传递给 mock function 的参数值
EXPECT_CALL(foo, SetTimeOut(Eq(10))
}