了解Gtest中的事件机制

  • 引入事件机制
    举例:我们使用gtest框架测试STL中的map这个数据结构时,我们假设只测find(),size()这两个函数,如果不使用事件机制,则测试的TEST()部分如下:
    了解Gtest中的事件机制_第1张图片

我们可以看到,在每一个TEST内部都创建了一个map结构,并进行了插入操作,这样就做了很多重复的事情。

其实gtest提供了三种事件机制,就是提供一个机会,使得在测试之前/之后能够准备/清理一些数据。(联系一下C++里的构造函数和析构函数,有点像。。)
这三种事件机制分别是指以下三种:
1、TestCase级别的:即在执行每个TestCase之前与之后进行;
2、TestSuite级别的:即在每个Test执行之前与之后(在这批案例中第一个案例执行之前、与最后一个案例执行之后);
3、全局的,即在所有案例执行前后进行。

  • TestCase级别事件
    实现TestCase事件,需要实现一个类并继承自类testing::Test,在该类内含有两个函数SetUp() 和 TearDown(),SetUp()在每个TestCase执行之前会执行,而TearDown()在每个TestCase执行之后会进行。
class MyMap:public testing::Test
{
    public:
        virtual void SetUp()
        {}
        virtual void TearDown()
        {}
};

注意这里的SetUp和TearDown方法其实是重写了基类的方法。

  • TestSuite级别事件
    TestSuite级别的事件是在实现上述类的基础上实现两个静态函数SetUpTestCase() 和 TesrDownTestCase()。
    SetUpTestCase() 在第一个TestCase执行之前做;
    TesrDownTestCase() 在最后一个TestCase执行之后执行。
class MyMap:public testing::Test
{
    public:
        static void SetUpTestCase()
        {}
        static void TearDownTestCase()
        {}
};

使用TestCase级别的事件和TestSuite级别的事件时,我们不应该再使用TEST()宏函数,而应该使用TEST_F()

  • 全局事件
    要实现全局事件与上述两个事件一样,都需要继承一个类,但全局事件需要继承的类是testing::Environment。在类内需要实现SetUp() 和 TearDown()两个方法。
    SetUp()在所有的案例执行之前执行;
    TearDown()在所有的案例执行之后执行。
class GlobalTest:public testing::Environment
{
    public:
        virtual void SetUp()
        {}
        virtual void TearDown()
        {}
};

使用全局事件时需要注意的是:在main函数中加入
testing::AddGlobalTestEnvironment方法,在调用这个方法之前生成一个类的对象,使用AddGlobalTestEnvironment()将这个对象添加到main中,即将其事件挂接上去。

现在我们在回过头来使用事件机制来测一测我们的map.find()和map.size():

1、使用TestCase事件:

//在每一个test_case执行之前和之后,执行SetUp()和TearDown()
class TestMap:public testing::Test
{
public:
    void SetUp()
    {
        cout<<"Setup()"<1,1));
        mp.insert(make_pair(2,1));
        mp.insert(make_pair(3,1));
        mp.insert(make_pair(4,1));
    }

    void TearDown()
    {
        mp.clear();
        cout<<"Teardown()"<map<int,int> mp;
};

其运行结果如图,从图中我们可以很明显的看到,在每一个TestCase执行前后都调用了SetUp和TearDown方法:
了解Gtest中的事件机制_第2张图片

2、使用Test事件机制:


//在第一个test之前,最后一个test之后调用SetUpTestCase()和TearDownTestCase()
class TestMap:public testing::Test
{
public:
    static void SetUpTestCase()
    {
        cout<<"SetUpTestCase()"<static void TearDownTestCase()
    {
        cout<<"TearDownTestCase()"<void SetUp()
    {
        cout<<"SetUp()"<1,1));
        mp.insert(make_pair(2,1));
        mp.insert(make_pair(3,1));
        mp.insert(make_pair(4,1));
    }

    void TearDown()
    {
        mp.clear();
        cout<<"TearDown()"<map<int,int> mp;
};

其结果如图所示:
了解Gtest中的事件机制_第3张图片

3、使用全局事件机制:

使用全局事件机制的代码如下,这里有两个测试案例,TestMap和TestFun,GlobalTest类中的SetUp方法会在所有的案例执行之前执行,而TearDown会在这两个案例执行完成之后执行。以下是我给出的测试代码:

#include 
#include 
#include 
using namespace std;

//全局
class GlobalTest:public testing::Environment
{
public:
    virtual void SetUp()
    {
        cout<<"gtest introduction example. SetUp"<virtual void TearDown()
    {
        cout<<"gtest introduction example. TearDown"<map<int,int> mp;
};

//在第一个test之前,最后一个test之后调用SetUpTestCase()和TearDownTestCase()
class TestMap:public testing::Test
{
public:
    static void SetUpTestCase()
    {
        cout<<"Map. SetUpTestCase()"<static void TearDownTestCase()
    {
        cout<<"Map. TearDownTestCase()"<void SetUp()
    {
        cout<<"Map. SetUp()"<1,1));
        mp.insert(make_pair(2,1));
        mp.insert(make_pair(3,1));
        mp.insert(make_pair(4,1));
    }

    void TearDown()
    {
        mp.clear();
        cout<<"Map. TearDown()"<map<int,int> mp;
};

class TestFun:public testing::Test
{
public:
    static void SetUpTestCase()
    {
        cout<<"Fun. SetUpTestCase()"<static void TearDownTestCase()
    {
        cout<<"Fun. TearDownTestCase()"<map<int,int>::iterator it = mp.find(2);
    ASSERT_NE(it,mp.end());
}

TEST_F(TestMap,Size)
{
    ASSERT_EQ(4,mp.size());
}

TEST_F(TestFun,ZeroEqual)
{
    EXPECT_EQ(0,0);
}

int main(int argc,char** argv)
{
    testing::InitGoogleTest(&argc,argv);
    testing::Environment* env = new GlobalTest();
    testing::AddGlobalTestEnvironment(env);
    return RUN_ALL_TESTS();
}

其结果如图所示:
了解Gtest中的事件机制_第4张图片

附:关于TestSuite级别的事件机制和TestCase级别的事件机制
我们知道TEST(test_case_name,test_name)宏函数有两个参数,这里可以将test_case_name理解为一个目录,test_name理解为这个目录下的众多子目录,在执行测试的时候test_case_name所标识的就是TestSuite级别的,而每一个Test级别的就是test_name标识的测试。
以上边的TestMap和Testfun举例,在Linux下可以通过 –gtest_list_tests选项来查看需要执行的案例:
了解Gtest中的事件机制_第5张图片

根据这张图应该就很好理解这些概念了!^_^

你可能感兴趣的:(测试)