全局设置和拆卸
正如您可以在test
级别和test suite
级别进行set-up
和tear-down
一样,您也可以在测试程序级别(test program
)进行设置和拆卸。方法如下。
首先,对::testing::Environment
类派生一个类以定义一个测试环境,该环境知道如何set-up
和tear-down
:
class Environment : public ::testing::Environment {
public:
// override保留字表示当前函数重写了基类的虚函数。
~Environment() override {}
// Override this to define how to set up the environment.
void SetUp() override {}
// Override this to define how to tear down the environment.
void TearDown() override {}
};
然后,通过调用::testing::AddGlobalTestEnvironment()
函数向 googletest 注册Environment class
的实例:
Environment* AddGlobalTestEnvironment(Environment* env);
现在,当RUN_ALL_TESTS()
被调用时,它会首先调用每个Environment对象的SetUp()
方法,然后,如果没有任何环境报告致命故障,并且没有调用GTEST_SKIP()
,则运行测试。无论测试是否运行,RUN_ALL_TESTS()
都会为每个Environment对象调用TearDown()
。
允许注册多个Environment对象。在此suite
中,会按注册顺序调用它的SetUp()
方法,并按相反的顺序调用它的TearDown()
。
注意:googletest拥有已经注册的Environment对象的所有权,因此,不要再自己手动删除它们。
你应该在调用RUN_ALL_TESTS()
之前先调用AddGlobalTestEnvironment()
,比如:在main()
函数中。
如果使用了gtest_main
,则需要在main()
开始之前调用它才能生效。一种方法是定义如下的全局变量:
testing::Environment* const foo_env =
testing::AddGlobalTestEnvironment(new FooEnvironment);
但是,我们强烈建议您编写自己的main()
函数并在mian()
函数中调用AddGlobalTestEnvironment()
。因为依赖全局变量的初始化会使代码更难阅读,并且当您在不同的编译单元注册了多个环境并且这些环境之间存在依赖关系时,可能会导致问题(注意:编译器不保证来自不同编译单元的全局变量的初始化顺序)。