在 Google 的 C++ 测试框架中为多个单元测试创建一个二进制文件
Creating one binary for multiple unit tests in Google's C++ Testing Framework
目前我有一个 test
文件夹,每个测试都有多个源文件。在 CMake 上,我之前为每个源文件定义了一个二进制文件,但我决定现在应该将所有源文件组合成一个二进制文件,并利用 GTest 中的过滤器来 select 我想 运行 进行哪些测试. None 这些源文件有一个 main()
函数,但我猜 GTest 框架只是在 运行 时间隐式调用它。
所以现在我创建了一个测试管理器源文件,除了调用 InitGoogleTests
和 RUN_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.
很容易做到这一点
目前我有一个 test
文件夹,每个测试都有多个源文件。在 CMake 上,我之前为每个源文件定义了一个二进制文件,但我决定现在应该将所有源文件组合成一个二进制文件,并利用 GTest 中的过滤器来 select 我想 运行 进行哪些测试. None 这些源文件有一个 main()
函数,但我猜 GTest 框架只是在 运行 时间隐式调用它。
所以现在我创建了一个测试管理器源文件,除了调用 InitGoogleTests
和 RUN_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.
很容易做到这一点