使用 Google Test 和 CMake 在子文件夹中配置测试

Posted

技术标签:

【中文标题】使用 Google Test 和 CMake 在子文件夹中配置测试【英文标题】:Configuring Tests in subfolders using Google Test and CMake 【发布时间】:2016-01-30 04:39:36 【问题描述】:

这应该是一个相当简单的问题,但考虑到使用 cmake 构建项目的黑魔法,它将帮助相当多的人解决这个问题。

我正在尝试让我的代码库更有条理。为此,我正在根据其域创建包含测试套件的子文件夹。

Google 测试本身已经在编译和运行,唯一的问题是通过这种重组,Google 测试无法找到我拥有的任何测试用例。

这是我的结构:

测试\ | \域1\ |CMakeLists.txt |domain1_test.cpp |domain1_test.hpp |[.. 更多测试...] \域2\ |CMakeLists.txt |domain2_test.cpp |domain2_test.hpp |[.. 更多测试 ...] |main.cpp |CMakeLists.txt

如您所见,我有两个存放测试的文件夹。

其中的CMakeLists.txt文件如下:

SET(DOMAIN1_TEST_SRC domain1_test.cpp domain1_test.hpp) ADD_LIBRARY(domain1testlib 静态 $DOMAIN1_TEST_SRC) TARGET_LINK_LIBRARIES(domain1testlib $Boost_LIBRARIES 域库 测试 ) TARGET_INCLUDE_DIRECTORIES(domain1testlib 界面 $CMAKE_CURRENT_SOURCE_DIR)

主测试目录中的CMakeLists.txt 是:

add_subdirectory(domain1) add_subdirectory(domain2) ADD_EXECUTABLE(my_domain_tests main.cpp) TARGET_LINK_LIBRARIES(my_domain_tests $Boost_LIBRARIES domain1testlib domain2testlib 竞争库 测试 ) add_test(MyTestSuite my_domain_tests)

我做错了什么?

运行测试只是说没有找到测试。

谢谢!

更新 添加我的 main.cpp

其实没什么特别的,只是样板的 main.cpp 文件。

#include "gtest/gtest.h"

int main(int argc, char ** argv) 

    ::testing::InitGoogleTest(&argc, argv);

    return RUN_ALL_TESTS();

【问题讨论】:

有几件事要检查。您的main.cpp 中有什么内容?您是否需要它,或者您可以链接到gtest_main 而不是gtest,从而允许 gtest 本身计算出哪些测试可以运行?您的***CMakeLists.txt 是否在某处调用了enable_testing() 我添加了我正在使用的 main.cpp 文件。是的,我的*** CMakeLists.txt 有 enable_testing() 调用。 【参考方案1】:

问题是你的domain*testlibs 中没有符号被你的可执行源引用,即main.cpp

Google Test 中的 TESTTEST_F 宏会自动向测试运行程序注册测试用例。因此,您的测试源文件实际上包含对 gtest 库中符号的引用,而不是相反。因此,链接器不会包含您的任何实际测试用例。

您应该将domain*_test.cppdomain*_test.hpp文件作为可执行源的一部分,而不是使用它们创建库。您可以直接引用文件或使用在每个 CMakeLists.txt 中定义的变量和源列表。

【讨论】:

是的,这解决了问题。所以,基本上你必须引用主 CMakeLists.txt 中的所有内容。我想通过使用库,我可以通过编译我想要测试的东西来节省编译时间。 @HectorVillarreal:好吧,make 已经负责编译新的/修改过的源代码,即使您只编译了一个源文件,也必须再次进行链接。因此,您不会节省太多编译时间,实际上,如果您没有库,它(只是稍微)会更快,因为您不需要花时间创建和扩展档案。【参考方案2】:

我做错了什么?

运行测试只是说没有找到测试。

使“make test”可用并在您需要的构建目录中工作 ctest

  ENABLE_TESTING()# Force "make test" to works

在 CMakeLists.txt 中的 add_test 之前

【讨论】:

问题不在于make test 不运行测试可执行文件。 OP 说他运行测试并且可执行文件报告没有找到测试。另外,他使用的不是CTest,而是gtest

以上是关于使用 Google Test 和 CMake 在子文件夹中配置测试的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu安装google test

cmake处理多源文件目录

如何编译google test的例子

在现代 CMake 中设置全局选项?

更正 CMakeList.txt 文件以进行 Google 测试?

CMake 找不到 boost_test