为什么测试夹具在Google Test中有一个SetUp方法?构造函数不是有效的一样吗?同样适用于TearDown方法.对SetUp和构造函数以及TearDown和Destructor的调用与TestEventListeners:OnTestStart和OnTestEnd一致.
Kir*_*ril 39
我应该使用测试夹具的构造函数/析构函数还是设置/拆卸功能?
首先要记住的一点是,googletest并不能重复使用多个测试相同的测试夹具对象.对于每一个
TEST_F,googletest将创建一个新的测试夹具对象,立即调用SetUp(),运行测试体,调用TearDown(),然后删除测试夹具对象.当您需要编写每个测试设置和拆卸逻辑时,您可以选择使用测试夹具构造函数/析构函数还是
SetUp()/TearDown().前者通常是首选,因为它具有以下好处:
- 通过在构造函数中初始化成员变量,我们可以选择创建它
const,这有助于防止意外更改其值并使测试更加明显正确.- 在情况下,我们需要继承测试夹具类,子类的构造函数是保证调用基类的构造函数首先,与子类析构函数是保证调用基类的析构函数 之后.有了
SetUp()/TearDown(),子类可能会忘记忘记调用基类SetUp()/TearDown()或在错误的时间调用它们.您可能仍希望
SetUp()/TearDown()在以下罕见情况下使用:
- 在构造函数(或析构函数)的主体中,不可能使用
ASSERT_xx宏.因此,如果设置操作可能导致致命测试失败,导致测试无法运行,则必须使用CHECK宏或使用SetUp()而不是构造函数.- 如果拆除操作可能抛出异常,则必须使用
TearDown()而不是析构函数,因为抛出析构函数会导致未定义的行为,并且通常会立即终止程序.请注意,在编译器中启用异常时,可能会抛出许多标准库(如STL).因此,您应该更喜欢TearDown()编写可以使用或不使用异常的可移植测试.- googletest团队正在考虑将断言宏放在启用了异常的平台上(例如Windows,Mac OS和Linux客户端),这将消除用户将故障从子例程传播到其调用者的需要.因此,如果您的代码可以在这样的平台上运行,则不应在析构函数中使用googletest断言.
- 在构造函数或析构函数中,您无法对此对象进行虚函数调用.(您可以调用声明为virtual的方法,但它将静态绑定.)因此,如果需要调用将在派生类中重写的方法,则必须使用
SetUp()/TearDown().