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