为什么一个测试夹具在谷歌测试一个设置方法? 是不是有效的构造函数同样的事情? 同样地,对于拆机方法。 通话双方设置和构造函数,以及TearDown中和析构函数,是与TestEventListeners一致:OnTestStart和OnTestEnd。
Answer 1:
有一个答案是,在常见问题 :
我应该使用的测试夹具或建立/拆除函数的构造函数/析构函数?
首先要记住的一点是,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断言在析构函数,如果你的代码可能会这样的平台上运行。
- 在构造函数和析构函数,你不能让这个对象的虚函数调用。 (您可以拨打声明为虚的方法,但它将静态绑定)。因此,如果您需要调用将在派生类中重写的方法,你必须使用
SetUp()/TearDown()
文章来源: SetUp vs Constructor in Test Fixture