如何避免使用 GoogleTest 混合测试和生产代码?

How to avoid mixing test and production code using GoogleTest?

我开始使用 GoogleTest。 运行 测试似乎需要一个主文件:

Separate test cases across multiple files in google test

但目前在我的演示应用程序中我已经有了一个主文件:

src/
-> MyType.h
-> main.cpp
-> Makefile

这最终将成为我的 "production" 申请。我不想用 gtest 包含、宏等来混淆它。

我是否应该在另一个文件夹中创建另一个 main.cpp 文件,例如:test/,它将包含所有特定的 gtest 配置,所以我最终会得到:

src/
-> MyType.h
-> main.cpp
-> Makefile // Makefile for producing production code/binaries
Test/
-> MyTypeTest.h // Unittest for MyType
-> main.cpp // The "Test runner"
-> Makefile // Makefile for producing test executable

编辑:

根据cmake找到这个:

http://www.kaizou.org/2014/11/gtest-cmake/

这似乎正是我要找的。

可能有很多方法可以做到这一点,但一般来说,是的,你应该在你的项目中添加一个测试专用的主函数。这使得编译有点复杂,因为您必须生成两个单独的二进制文件(一个用于您的应用程序,另一个用于您的测试),但这是一个相当典型的设置。

我只需添加一个带有主文件的 test.cpp 文件并在我的 makefile 中创建一个 test 目标,这样我就可以 make - 构建我的生产代码 - 或者make test - 构建测试。在实际项目中,我以非常相似的方式使用 cmake(我有时将所有常见的依赖项捆绑在一个 core.a 库中,然后 link main 和针对它进行测试)。

最明智的做法是为生产代码准备一个库,然后准备两个可执行文件,一个用于生产,另一个用于测试:

|-lib/
| |-Makefile
| |-mytype.h
| `-mytype.cpp
|-app/
| |-Makefile
| `-main.cpp
`-test/
  |-Makefile
  `-mytypetest.cpp

请注意,gtest 发行版为您的测试可执行文件提供了 gtest 库和一个带有标准 main 函数的 gtest_main 库。因此,除非您需要一个自定义的 main(极少数情况),否则您不需要为您的测试提供 main.cpp,并且可以简单地 link 反对 gtest_main,例如$(CC) mytypetest.cpp -o apptests -lapplib -lgtest_main -lgtest.

库方法涉及稍微复杂的 Makefiles,但它在编译时间上得到回报,因为没有它意味着您需要编译 mytype.cpp 一次用于生产应用程序,一次用于测试可执行文件.