得之我幸 失之我命

when someone abandons you,it is him that gets loss because he lost someone who truly loves him but you just lost one who doesn’t love you.

gtest 的事件

gtest 的事件机制有两类基本的意义:

  1. 在指定条件和场景前后处理相关数据
  2. 提供指定条件和场景前后的结果通知

gtest 中的事件分成基本的三个层次,即整个测试程序、相关测试的组 / 套件、测试用例,对应 gtest 中三类基本的事件机制:

全局事件

所有 case 执行前后动作

需要自定义一个测试类,继承自 testing::Environment 类,实现使用的标记 SetUp()、TearDown() 两个虚函数,在所有测试开始前执行 SetUp() 函数,测试结束后执行 TearDown() 函数

1
2
3
4
5
6
7
8
9
10
11
12
class FooEnvironment : public testing::Environment
{
public:
    virtual void SetUp()
    {
        std::cout << "Foo FooEnvironment SetUP" << std::endl;
    }
    virtual void TearDown()
    {
        std::cout << "Foo FooEnvironment TearDown" << std::endl;
    }
};

需要告诉 gtest 添加这个全局事件,需要在 main() 函数中通过 testing::AddGlobalTestEnvironment 方法将事件挂进来,也就是说,可以写很多个这样的类,然后将他们的事件都挂上去

1
2
3
4
5
6
int _tmain(int argc, _TCHAR* argv[])
{
    testing::AddGlobalTestEnvironment(new FooEnvironment);
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

组处理事件

每组 case 执行前后动作

需要定义一个类,继承自 testing::Test,实现应用标记 SetUpTestSuite()、TearDownTestSuite() 两个静态函数,在组执行前执行这两个相关函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class FooTest : public testing::Test
{
protected:
static void SetUpTestSuite()
{
shared_resource_ = new ;
}
static void TearDownTestSuite()
{
     delete shared_resource_;
     shared_resource_ = NULL;
   }
   // Some expensive resource shared by all tests.
   static T* shared_resource_;
};

组处理事件不需要像全局事件那样需要注册,在编写 case 时,需要使用 TEST_F 这个宏,第一个参数必须是上面类的名字,代表一个 TestSuite

1
2
TEST_F(FooTest, Test1) {}
TEST_F(FooTest, Test2) {}

Case事件

每个 case 执行前后动作

和组事件创建类似,它使用的标记是 SetUp()、TearDown() 两个函数,非静态,在执行案例前调用这两个相关函数即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class FooCalcTest : public testing::Test
{
protected:
    virtual void SetUp()
    {
        m_foo.Init();
    }
    virtual void TearDown()
    {
        m_foo.Finalize();
    }

    FooCalc m_foo;
};

在编写 case 时,需要使用 TEST_F 这个宏

1
2
3
4
TEST_F(FooCalcTest, HandleNoneZeroInput)
{
    EXPECT_EQ(4, m_foo.Calc(1216));
}

all time is no time when it is past.