【问题标题】:SetUp vs Constructor in Test Fixture测试夹具中的设置与构造函数
【发布时间】:2012-11-27 10:05:40
【问题描述】:

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

【问题讨论】:

标签: c++ googletest


【解决方案1】:

an answer to that in the FAQ

我应该使用测试夹具的构造函数/析构函数还是set-up/tear-down函数?

首先要记住的是 googletest 确实重复使用相同的测试 跨多个测试的夹具对象。对于每个TEST_F,googletest 将创建 一个新鲜的测试夹具对象,立即调用SetUp(),运行测试体, 调用TearDown(),然后删除测试夹具对象。

当您需要编写每个测试的设置和拆卸逻辑时,您可以选择 在使用测试夹具构造函数/析构函数或SetUp()/TearDown() 之间。 前者通常是首选,因为它有以下好处:

  • 通过在构造函数中初始化一个成员变量,我们可以选择 设置为const,这有助于防止意外更改其值和 使测试更明显正确。
  • 如果我们需要子类化测试夹具类,子类' 构造函数保证调用基类的构造函数first,并且 保证子类的析构函数调用基类的析构函数 之后。使用SetUp()/TearDown(),子类可能会犯以下错误 忘记调用基类'SetUp()/TearDown() 或在 时间不对。

在以下极少数情况下,您可能仍想使用SetUp()/TearDown()

  • 在构造函数(或析构函数)的主体中,不能使用 ASSERT_xx 宏。因此,如果设置操作可能导致致命 应该阻止测试运行的测试失败,有必要 使用 CHECK 宏或使用 SetUp() 而不是构造函数。
  • 如果拆卸操作可能引发异常,则必须使用 TearDown() 与析构函数相反,因为投入析构函数会导致 未定义的行为,通常会立即杀死您的程序。笔记 当异常发生时,许多标准库(如 STL)可能会抛出 在编译器中启用。因此,如果您愿意,您应该更喜欢TearDown() 想要编写可移植的测试,不管有没有异常都可以工作。
  • googletest 团队正在考虑启用断言宏 启用异常的平台(例如 Windows、Mac OS 和 Linux 客户端),这将消除用户传播的需要 从子例程到其调用者的失败。因此,您不应该使用 如果您的代码可以在这样的 平台。
  • 在构造函数或析构函数中,不能对虚函数进行调用 这个对象。 (您可以调用声明为虚拟的方法,但它会是 静态绑定。)因此,如果您需要调用将被 在派生类中被覆盖,您必须使用SetUp()/TearDown()

【讨论】:

  • 什么时候在 gtest 流程中调用构造函数和析构函数?
  • 链接现在已损坏,我在 gtest 常见问题解答中找不到 SetUp() 与构造函数的提及。这个答案很老了……知道实现是否发生了变化吗?
  • 除非您使用参数化测试,否则它确实会重用真正糟糕的夹具。
  • 在 C++ 中抛出析构函数不是 UB。就像在堆栈展开期间调用它会终止程序一样危险。用户定义的析构函数默认为noexcept(true),但可以被覆盖。你具体指的是什么?
猜你喜欢
  • 2016-11-07
  • 2013-02-11
  • 2023-03-28
  • 1970-01-01
  • 2012-12-29
  • 2013-09-28
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
相关资源
最近更新 更多