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

How to avoid mixing test and production code using GoogleTest?

本文关键字:代码 测试 混合 何避免 GoogleTest      更新时间:2023-10-16

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

谷歌测试中跨多个文件分离测试用例

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

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

这最终将成为我的"生产"应用程序。我不想用 gtest 包含、宏等来混淆它。

我是否应该在另一个文件夹中创建另一个主.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/

这似乎正是我正在寻找的。

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

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

请注意,gtest 发行版为测试可执行文件提供了具有标准 main 函数的gtest库和gtest_main库。因此,除非您需要自定义主(极少数情况),否则您无需为测试提供main.cpp,只需链接到gtest_main,例如 $(CC) mytypetest.cpp -o apptests -lapplib -lgtest_main -lgtest .

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

可能有很多

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

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