我们可以看到,在每一个TEST内部都创建了一个map结构,并进行了插入操作,这样就做了很多重复的事情。
其实gtest提供了三种事件机制,就是提供一个机会,使得在测试之前/之后能够准备/清理一些数据。(联系一下C++里的构造函数和析构函数,有点像。。)
这三种事件机制分别是指以下三种:
1、TestCase级别的:即在执行每个TestCase之前与之后进行;
2、TestSuite级别的:即在每个Test执行之前与之后(在这批案例中第一个案例执行之前、与最后一个案例执行之后);
3、全局的,即在所有案例执行前后进行。
class MyMap:public testing::Test
{
public:
virtual void SetUp()
{}
virtual void TearDown()
{}
};
注意这里的SetUp和TearDown方法其实是重写了基类的方法。
class MyMap:public testing::Test
{
public:
static void SetUpTestCase()
{}
static void TearDownTestCase()
{}
};
使用TestCase级别的事件和TestSuite级别的事件时,我们不应该再使用TEST()宏函数,而应该使用TEST_F()
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方法:
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;
};
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();
}
附:关于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选项来查看需要执行的案例:
根据这张图应该就很好理解这些概念了!^_^