繁体   English   中英

C ++ Google Test在哪里放置测试装置构造函数定义

[英]C++ Google Test Where to Put Test Fixture Constructor Definition

我最近将Google Test用于我的C ++代码。 当我阅读如何设置测试夹具进行测试时,我有些困惑。 编写main()函数会话显示了有关测试治具类外观的示例。 但是,当涉及到构造函数定义时,是否应该将其放在测试夹具类中? 例如,类似于google测试文档给出的以下代码段:

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. 在这种情况下,在测试夹具类之外定义构造函数是否更有意义? 但这会降低测试代码的可读性,我真的不知道该怎么办。

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

关于问题1,这完全取决于编译器-可以自由决定是否以及如何内联函数。 即使您将函数显式声明为inline ,就编译器而言,它仍然只是一个建议,如果它决定生成的机器代码过于肿或效率低下,则可以随意忽略该建议。

C ++常见问题解答包含有关该主题的更多详细信息:

有几种方法可以指定函数为内联,其中一些涉及inline关键字,而其他则不涉及。 无论您如何将函数指定为内联函数,都要求编译器忽略该请求:编译器可能会内联扩展您调用被指定为内联函数的位置的部分,全部或全部。 (不要灰心,因为这似乎是无望的模糊。上述的灵活性实际上是一个巨大的优势:它使编译器对大型函数与小型函数的处理不同,此外,它使编译器生成易于调试的代码(如果选择)正确的编译器选项。)

关于问题2,我建议您随便阅读最容易理解的内容。 当我使用Google Tests时,我个人将所有“共享”代码放在测试夹具定义中,然后紧接着在该夹具中运行的所有单元测试的TEST_F声明。

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

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

// ...more tests...

不过,这只是一个建议。 选择一个适合您的标准并持续使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM