我最近在使用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)
的定义,似乎对于与相同测试夹具相关联的每个测试,宏将创建测试夹具类的新子类。
鉴于上述事实,
如果构造函数的工作量很大,这是否意味着测试夹具构造函数的隐式inline
会让编译器在任何地方扩展构造函数的大块代码? (或者在同一翻译单元中这无关紧要?)
在这种情况下,在测试夹具类之外定义构造函数更有意义吗?但是这会使测试代码的可读性降低,我真的不知道该怎么做..
有人可以给我一些建议吗?谢谢!
答案 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...
但这只是一个建议。选择一个适合您的标准并一致地使用它。