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

Configuring Tests in subfolders using Google Test and CMake

这应该是一个相当简单的问题,但考虑到使用 cmake 构建项目的魔法,它将帮助很多为此苦苦挣扎的人。

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

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

这是我的结构:

tests\
     |
     \domain1\
             |CMakeLists.txt
             |domain1_test.cpp
             |domain1_test.hpp
             |[.. more tests ...]
     \domain2\
             |CMakeLists.txt
             |domain2_test.cpp
             |domain2_test.hpp
             |[.. more tests ...]
     |main.cpp
     |CMakeLists.txt

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

其中的CMakeLists.txt个文件如下:

SET(DOMAIN1_TEST_SRC
        domain1_test.cpp
        domain1_test.hpp)

ADD_LIBRARY(domain1testlib STATIC ${DOMAIN1_TEST_SRC})

TARGET_LINK_LIBRARIES(domain1testlib
        ${Boost_LIBRARIES}
        domain_lib
        gtest
        )

TARGET_INCLUDE_DIRECTORIES(domain1testlib
        INTERFACE
        ${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
        comptestlib
        gtest
        )

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();
}

What am I doing wrong?

Running tests just says that No tests were found.

使 "make test" 可用并在您需要的构建目录中运行 ctest

  ENABLE_TESTING()# Force "make test" to works

在 add_test 之前 CMakeLists.txt

问题是您的 domain*testlib 中没有任何符号被您的可执行源引用,即 main.cpp

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

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