C++谷歌测试在哪里放置测试夹具构造函数定义

C++ Google Test Where to Put Test Fixture Constructor Definition

本文关键字:测试 夹具 构造函数 定义 谷歌 在哪里 C++      更新时间:2023-10-16

我最近正在为我的C++代码使用Google Test。当我读到如何设置测试夹具时,我有点困惑。Writing The main()Function会话展示了一个关于测试fixture类的示例。然而,当涉及到构造函数定义时,我们应该把它放在测试夹具类中吗?例如,类似于谷歌测试文档给出的以下代码片段:

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++常见问题解答提供了关于以下主题的更多详细信息:

有几种方法可以指定函数是内联的,其中一些方法涉及内联关键字,另一些方法则不涉及。无论您如何将函数指定为内联,编译器都可以忽略这一请求:编译器可能会内联扩展您调用指定为内联的函数的部分、全部或全部位置。(如果这看起来非常模糊,不要气馁。上述功能的灵活性实际上是一个巨大的优势:它可以让编译器区别对待大函数和小函数,此外,如果选择正确的编译器选项,它还可以让编译器生成易于调试的代码。)

关于问题2,我建议您选择最可读的内容。当我使用Google测试时,我亲自将所有"共享"代码放在测试夹具定义中,然后立即为在该夹具中运行的所有单元测试声明test_F。

class MyTestCase : public ::testing::Test
{
virtual void SetUp() override
{
// ...
}
}
TEST_F(MyTestCase, UnitTestNumber1)
{
// testing stuff here
}
// ...more tests...

不过,这只是一个建议。选择一个适合你的标准,并始终如一地使用它。