测试夹具中的设置与构造函数

SetUp vs Constructor in Test Fixture

本文关键字:构造函数 设置 夹具 测试      更新时间:2023-10-16

为什么测试装置在谷歌测试中有一个设置方法?构造函数实际上不是一回事吗?拆解方法也是如此。对 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().