在 Google 的 C++ 测试框架中为多个单元测试创​​建一个二进制文件

Creating one binary for multiple unit tests in Google's C++ Testing Framework

目前我有一个 test 文件夹,每个测试都有多个源文件。在 CMake 上,我之前为每个源文件定义了一个二进制文件,但我决定现在应该将所有源文件组合成一个二进制文件,并利用 GTest 中的过滤器来 select 我想 运行 进行哪些测试. None 这些源文件有一个 main() 函数,但我猜 GTest 框架只是在 运行 时间隐式调用它。

所以现在我创建了一个测试管理器源文件,除了调用 InitGoogleTestsRUN_ALL_TESTS()main() 之外什么都没有,并且包含所有测试源文件。根据 Google,那是 'hack to be used at last resort'.

那我应该如何正确地做到这一点?我真的应该为我的每个测试源创建头文件并在那里编写声明,然后将所有这些头文件包含在我的测试管理器源中吗?还有其他……更简单的……方法吗?

不,您不需要对这些文件执行任何特殊操作...

您所有的 TEST_F 和类似的宏都将链接在一起 运行。这是 googletest 的魔法...

实际上你不需要这个 "test manager source" 和 main() - 只需使用你的 googletest/googlemock 发行版中的文件:

gmockxxx/src/gmock_main.cc

gtestxxx/src/gtest_main.cc

将测试所需的所有源文件和头文件包含到一个项目中。您不需要包含 "main" 源文件,除非在 gtest 初始化之前需要进行一些特殊设置。只是 link 你的带有两个 GTest 库的测试项目:

-lgtest -lgtest_main

后一个 gtest_main 库包含基本的 main() 功能。

GTest Primer: Writing the main() function

中有描述

您可能遇到这样一种情况,您测试的每个 类 都依赖于多个源文件(其他帮助程序 类)。您希望将这些经过测试的 类 保存在单独的可执行文件中以测试清洁度,以确保它们每个都只使用需要的文件并且不依赖于其他经过测试的 类 使用的文件。此解决方案还可以减少编译时间。

在这种情况下,您必须制作自己的测试运行器来执行所有测试可执行文件,并可能打印出其中哪些有错误。使用 Bash 或 Python.

很容易做到这一点