C++;Google测试将测试夹具构造函数定义放在何处 我最近使用谷歌测试作为我的C++代码。当我阅读如何为测试设置测试夹具时,我有点困惑。该课程展示了一个关于测试夹具类的示例。然而,当涉及到构造函数定义时,我们是否应该将其放在testfixture类中?例如,如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. } }

C++;Google测试将测试夹具构造函数定义放在何处 我最近使用谷歌测试作为我的C++代码。当我阅读如何为测试设置测试夹具时,我有点困惑。该课程展示了一个关于测试夹具类的示例。然而,当涉及到构造函数定义时,我们是否应该将其放在testfixture类中?例如,如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. } },c++,unit-testing,constructor,inline,googletest,C++,Unit Testing,Constructor,Inline,Googletest,我还研究了宏TEST\F(TEST\u fixture\u name,TEST\u name)的定义,似乎对于与同一测试夹具关联的每个测试,宏都将创建测试夹具类的新子类 鉴于上述事实, 如果构造函数的工作量很大,这是否意味着测试夹具构造函数的隐式inline将允许编译器在任何地方扩展构造函数的大块代码?(或者这在同一个翻译单元中并不重要?) 在这种情况下,在测试夹具类之外定义构造函数更有意义吗?但是这会降低测试代码的可读性,我真的不知道该怎么做 有谁能给我一些建议吗?谢谢 关于问题1,这完全取决

我还研究了宏
TEST\F(TEST\u fixture\u name,TEST\u name)
的定义,似乎对于与同一测试夹具关联的每个测试,宏都将创建测试夹具类的新子类

鉴于上述事实,

  • 如果构造函数的工作量很大,这是否意味着测试夹具构造函数的隐式
    inline
    将允许编译器在任何地方扩展构造函数的大块代码?(或者这在同一个翻译单元中并不重要?)

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


  • 有谁能给我一些建议吗?谢谢

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

    有关此主题的详细信息,请参见:

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

    关于问题2,我建议你选择你认为可读性最好的。当我使用Google测试时,我个人会将所有“共享”代码放在测试夹具定义中,然后立即为在该夹具中运行的所有单元测试声明test_F

    class MyTestCase : public ::testing::Test
    {
        virtual void SetUp() override
        {
            // ...
        }
    }
    
    TEST_F(MyTestCase, UnitTestNumber1)
    {
        // testing stuff here
    }
    
    // ...more tests...
    
    不过,这只是一个建议。选择一个适合你的标准,并始终如一地使用它