45

为什么测试夹具在 Google Test 中有一个 SetUp 方法?构造函数实际上不是同一件事吗?对于 TearDown 方法也是如此。对 SetUp 和 Constructor 以及 TearDown 和 Destructor 的调用与 TestEventListener 一致:OnTestStart 和 OnTestEnd。

4

1 回答 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 回答