测试夹具中的设置与构造函数
SetUp vs Constructor in Test Fixture
为什么测试装置在谷歌测试中有一个设置方法?构造函数实际上不是一回事吗?拆解方法也是如此。对 SetUp 和 Constructor 以及 TearDown 和 Destructor 的调用与 TestEventListeners 一致:OnTestStart 和 OnTestEnd。
在FAQ中有一个答案:
我应该使用测试夹具的构造函数/析构函数还是设置/拆卸功能?
首先要记住的是,googletest不会重用相同的测试 跨多个测试的夹具对象。对于每个
TEST_F
,谷歌测试将创建一个新鲜的测试治具对象,立即调用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()
.
相关文章:
- 如何在构造函数中使用初始值设定项设置具有相同值的 2d 数组?
- 构造函数将所有值设置为 0
- 如何在没有复制构造函数的情况下为地图设置值?
- 类中的 Arduino 对象构造函数设置垃圾值
- 为什么我的突变器函数没有设置任何内容?还是我的构造函数?
- 无法在构造函数中执行设置元素插入
- 在 c++ 中将对象设置为等于同一类的构造函数是否有效?
- 使用构造函数初始化结构还是在之后设置其值更好?
- 将复制构造函数设置为private和=delete有什么区别
- 我可以检查初始化列表中设置的构造函数主体中的变量吗
- 将复制构造函数设置为默认值在继承自 QObject 时不起作用
- 尝试将构造函数设置为 0 - c++ 的未处理异常
- C++构造函数设置值
- 多个线程 - 无法访问构造函数设置的类成员变量
- 什么时候应该将构造函数设置为 constexpr
- 在类中声明数组,并使用构造函数设置其大小
- 无法从构造函数设置私有值
- 我的第一个大小工作,但无法为我的其他构造函数设置大小
- 是否可以将默认构造函数设置为"std::map<T1,T2>"值?
- 在类构造函数中设置std::vector,为元素构造函数设置不同的值