SetUp与测试夹具中的构造函数

时间:2012-11-27 10:05:40

标签: c++ googletest

为什么测试夹具在Google Test中有一个SetUp方法?构造函数不是有效的一样吗?同样适用于TearDown方法。对SetUp和构造函数以及TearDown和Destructor的调用与TestEventListeners:OnTestStart和OnTestEnd一致。

1 个答案:

答案 0 :(得分:35)

an answer to that in the FAQ

  

我应该使用测试夹具的构造函数/析构函数还是设置/拆卸函数?

     

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

     

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

     
      
  • 通过在构造函数中初始化成员变量,我们可以选择   使它const,这有助于防止意外改变其价值和   使测试更加明显正确。
  •   
  • 如果我们需要子类化测试fixture类,子类'   保证构造函数首先调用基类'constructor   子类'析构函数保证调用基类'析构函数   之后。使用SetUp()/TearDown(),子类可能会犯错误   忘记调用基类'SetUp()/TearDown()或在调用它们   错误的时间。
  •   
     
    

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

  
     
      
  • 在构造函数(或析构函数)的主体中,不可能使用   ASSERT_xx个宏。因此,如果设置操作可能导致致命   测试失败,应该阻止测试运行,这是必要的   使用CHECK宏或使用SetUp()而不是构造函数。
  •   
  • 如果拆除操作可能会引发异常,您必须使用   TearDown()而不是析构函数,因为抛出析构函数会导致   未定义的行为,通常会立即杀死您的程序。注意   许多标准库(如STL)可能会在异常时抛出   在编译器中启用。因此,如果您愿意,您应该更喜欢TearDown()   希望编写可以使用或不使用例外的便携式测试。
  •   
  • googletest团队正在考虑让断言宏出现   启用例外的平台(例如Windows,Mac OS和Linux)   客户端),这将消除用户传播的需要   从子程序到其调用者的失败。因此,你不应该使用   如果您的代码可以在这样的情况下运行,则在析构函数中使用googletest断言   平台。
  •   
  • 在构造函数或析构函数中,您无法进行虚函数调用   这个对象。 (您可以调用声明为虚拟的方法,但它会   静态绑定。)因此,如果你需要调用一个方法   在派生类中重写,您必须使用SetUp()/TearDown()
  •