使用gtest时,在头文件中而不是.cpp文件中具有可测试类的优缺点?

时间:2018-07-24 23:17:52

标签: c++ gcc googletest

我正在接管具有巨大gtest套件的项目。我正在添加额外的测试。下面是我之前设置的方式。所有可测试的类都在头文件中,并包含在main.cpp(测试套件运行程序)中。 问题是,尝试使用大量包含的文件编译main.cpp时,编译器用完了内存。这样做的“正常”方法是将测试类放在单独的文件中,因为gtest通过宏扩展查找测试类。认为gtest会随着订阅者的加入而出现某种单例。 有人可以向我解释为什么以前的维护者在头文件中有测试类吗?优点和缺点请参见在头文件中包含测试类的代码示例。     //文件ZondTest.hpp

class ZondTest : public ::testing::Test

{
public:
   static const std::string INPUT_FILES_DIR;
protected:
   virtual void SetUp() //runs this set up before every test
   {
      //might put something here later if I need to

   }
};
const std::string ZondTest::INPUT_FILES_DIR =
                     "InputFiles/ZondManagerTest/";

class TestableZond_c : public Zond_c
{
public :

   TestableZond_c()
   {
   }

   virtual ~TestableZond_c()
   {
   }
};

//check if newly created zond has empty space
TEST(ZondTest,
       WhenCreatedNewZondWithoutSpaceExpectEmptySpace)
{
   TestableZond_c mTestableZond = TestableZond_c();
   EXPECT_TRUE(mTestableZond.SpaceEmpty());
}
// a tone more tests
// ....

包含在main.cpp中。

#include "RD/ZM/ZondTest.hpp"
//many more includes
//........
int main(int argc, char **argv) {
  ::testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}

2 个答案:

答案 0 :(得分:1)

我不确定将测试用例放在.hpp文件而不是.cpp文件中(例如,将FnordTest类放在FnordTest.hpp而不是FnordTest.cpp中会带来什么好处?

编译器(通常)不会为标头创建目标文件,因此有必要在main.cpp中包含所有这些.hpp文件,这可能会导致单个超大编译单元,从而导致编译器-如您所说-内存不足(尤其是在考虑googletest的宏魔术时)。

我只建议将测试放入.cpp文件中-这样,您甚至不需要包括它们; googletest自动查找您用TEST_P / TEST_F等声明的所有测试。

答案 1 :(得分:0)

我发现的一件事是,如果您使用的是Eclipse,则indexer无法找到一种方法来绑定googletest自动找到的文件。因此,文件的所有下划线都显得混乱。但是,如果将TEST_P / TEST_F放入头文件并将其包含在main中。 Eclipse索引器可以“抓取”包含的文件并构建索引,它看起来很漂亮,并且错误地认为这是正确的方法。