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

时间:2015-10-29 20:52:56

标签: c++ cmake googletest

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

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

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

这是我的结构:

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

2 个答案:

答案 0 :(得分:1)

问题是,您的domain*testlib中没有符号来自您的可执行文件来源,即main.cpp

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

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

答案 1 :(得分:-1)

  

我做错了什么?

     

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

提供"进行测试"并在build dir中工作ctest,你需要

  ENABLE_TESTING()# Force "make test" to works

在CMakeLists.txt中的add_test之前