为什么测试夹具在Google Test中有一个SetUp方法?构造函数不是有效的一样吗?同样适用于TearDown方法。对SetUp和构造函数以及TearDown和Destructor的调用与TestEventListeners:OnTestStart和OnTestEnd一致。
答案 0 :(得分:35)
有an answer to that in the FAQ:
我应该使用测试夹具的构造函数/析构函数还是设置/拆卸函数?
首先要记住的是googletest 不重复使用相同的测试 多个测试中的夹具对象。对于每个
TEST_F
,googletest都会创建 一个新鲜测试夹具对象,立即调用SetUp()
,运行测试体, 调用TearDown()
,然后删除测试夹具对象。当您需要编写每个测试设置和拆卸逻辑时,您可以选择 在使用测试夹具构造函数/析构函数或
SetUp()/TearDown()
之间。 前者通常是首选,因为它具有以下好处:
- 通过在构造函数中初始化成员变量,我们可以选择 使它
const
,这有助于防止意外改变其价值和 使测试更加明显正确。- 如果我们需要子类化测试fixture类,子类' 保证构造函数首先调用基类'constructor 子类'析构函数保证调用基类'析构函数 之后。使用
SetUp()/TearDown()
,子类可能会犯错误 忘记调用基类'SetUp()/TearDown()
或在调用它们 错误的时间。在以下极少数情况下,您可能仍希望使用
SetUp()/TearDown()
:
- 在构造函数(或析构函数)的主体中,不可能使用
ASSERT_xx
个宏。因此,如果设置操作可能导致致命 测试失败,应该阻止测试运行,这是必要的 使用CHECK
宏或使用SetUp()
而不是构造函数。- 如果拆除操作可能会引发异常,您必须使用
TearDown()
而不是析构函数,因为抛出析构函数会导致 未定义的行为,通常会立即杀死您的程序。注意 许多标准库(如STL)可能会在异常时抛出 在编译器中启用。因此,如果您愿意,您应该更喜欢TearDown()
希望编写可以使用或不使用例外的便携式测试。- googletest团队正在考虑让断言宏出现 启用例外的平台(例如Windows,Mac OS和Linux) 客户端),这将消除用户传播的需要 从子程序到其调用者的失败。因此,你不应该使用 如果您的代码可以在这样的情况下运行,则在析构函数中使用googletest断言 平台。
- 在构造函数或析构函数中,您无法进行虚函数调用 这个对象。 (您可以调用声明为虚拟的方法,但它会 静态绑定。)因此,如果你需要调用一个方法 在派生类中重写,您必须使用
SetUp()/TearDown()
。