C ++ Google测试放置测试夹具构造函数定义的位置

时间:2017-01-10 01:03:12

标签: c++ unit-testing constructor inline googletest

我最近在使用Google Test for C ++代码。当我阅读如何为测试设置测试夹具时,我有点困惑。 Writing the main() Function会话显示了测试夹具类的外观示例。但是,当它涉及构造函数定义时,我们应该将它放在测试夹具类中吗?例如,如google test doc提供的以下代码段:

class FooTest : public ::testing::Test {
 protected:
  // You can remove any or all of the following functions if its body
  // is empty.

  FooTest() {
    // You can do set-up work for each test here.
  }

  virtual ~FooTest() {
    // You can do clean-up work that doesn't throw exceptions here.
  }
}

我还查看了宏TEST_F(test_fixture_name, test_name)的定义,似乎对于与相同测试夹具相关联的每个测试,宏将创建测试夹具类的新子类。

鉴于上述事实,

  1. 如果构造函数的工作量很大,这是否意味着测试夹具构造函数的隐式inline会让编译器在任何地方扩展构造函数的大块代码? (或者在同一翻译单元中这无关紧要?)

  2. 在这种情况下,在测试夹具类之外定义构造函数更有意义吗?但是这会使测试代码的可读性降低,我真的不知道该怎么做..

  3. 有人可以给我一些建议吗?谢谢!

1 个答案:

答案 0 :(得分:1)

问题1,这完全取决于编译器 - 它有很大的自由来决定是否以及如何内联函数。即使您明确地将函数声明为inline,就编译器而言,它仍然只是一个建议,并且如果它决定结果的机器代码会过于膨胀或效率低下,则可以自由地忽略该建议。 p>

C++ FAQ有关于该主题的更多详细信息:

  

有几种方法可以指定函数是内联的,其中一些涉及内联关键字,另一些则不涉及。无论您如何将函数指定为内联,都是允许编译器忽略的请求:编译器可能内联展开您调用指定为内联函数的部分,全部或全部位置。 (如果这看起来毫无希望地模糊,请不要气馁。上述的灵活性实际上是一个巨大的优势:它允许编译器对待大型函数与小函数不同,而且它允许编译器生成易于调试的代码,如果您选择正确的编译器选项。)

在问题2中,我建议你选择你认为最具可读性的东西。当我使用Google Tests时,我个人将所有“共享”代码放在测试夹具定义中,紧接着是TEST_F声明,用于在该夹具内运行的所有单元测试。

class MyTestCase : public ::testing::Test
{
    virtual void SetUp() override
    {
        // ...
    }
}

TEST_F(MyTestCase, UnitTestNumber1)
{
    // testing stuff here
}

// ...more tests...

但这只是一个建议。选择一个适合您的标准并一致地使用它。