最近,我正在使用Google作为我的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)的定义,似乎对于每个与相同测试夹具相关联的测试,宏将创建测试夹具类的一个新子类。
鉴于上述事实,
inline将允许编译器将构造函数的大量代码扩展到任何地方?(或者这在同一个翻译单位不重要?)有人能给我一些建议吗?谢谢!
发布于 2017-01-10 01:36:32
关于问题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...不过,这只是个建议。选择一个对你有用的标准,并始终如一地使用它。
https://stackoverflow.com/questions/41559602
复制相似问题