使用 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 测试中的 TEST
和 TEST_F
宏会自动向测试运行器注册测试用例。因此,您的测试源文件实际上包含对 gtest 库中符号的引用,而不是相反。因此,链接器将不会包含您的任何实际测试用例。
您应该将 domain*_test.cpp
和 domain*_test.hpp
文件作为可执行源的一部分,而不是用它们创建库。您可以直接引用文件或使用每个 CMakeLists.txt
中定义的变量和源列表。
这应该是一个相当简单的问题,但考虑到使用 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 测试中的 TEST
和 TEST_F
宏会自动向测试运行器注册测试用例。因此,您的测试源文件实际上包含对 gtest 库中符号的引用,而不是相反。因此,链接器将不会包含您的任何实际测试用例。
您应该将 domain*_test.cpp
和 domain*_test.hpp
文件作为可执行源的一部分,而不是用它们创建库。您可以直接引用文件或使用每个 CMakeLists.txt
中定义的变量和源列表。