这应该是一个相当简单的问题,但考虑到使用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)
我究竟做错了什么?
运行测试只是说没有找到测试 .
谢谢!
UPDATE 添加我的main.cpp
它真的没什么特别的,只是样板main.cpp文件 .
#include "gtest/gtest.h"
int main(int argc, char ** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
2 回答
问题是
domain*testlib
中没有符号来自您的可执行文件源,即main.cpp
.Google Test中的
TEST
和TEST_F
宏会自动向测试运行器注册测试用例 . 因此,您的测试源文件实际上包含对gtest库中符号的引用,而不是相反 . 因此,链接器将不包含任何实际测试用例 .您应该将
domain*_test.cpp
和domain*_test.hpp
文件包含在可执行文件源中,而不是使用它们创建库 . 您可以直接引用文件或使用每个CMakeLists.txt
中定义的变量和源列表来执行此操作 .提供“make test”并在你需要的构建目录中工作ctest
在CMakeLists.txt中的add_test之前