【发布时间】:2020-01-29 22:07:44
【问题描述】:
我有一个使用 cmake 作为构建工具的 C++ 项目。我的目录结构如下所示。
当我在cmake-build-debug 内部时,我运行cmake ..,然后运行make clean && make && make test。我注意到的是只运行了第一个单元测试。如何配置我的项目,以便在运行 make test 时运行所有单元测试?在根目录下,我的CMakeLists.txt 如下所示。
cmake_minimum_required(VERSION 3.10)
project(my_lib)
set(CMAKE_CXX_STANDARD 17)
add_subdirectory(src)
add_subdirectory(tests)
enable_testing()
我的tests/CmakeLists.txt 如下所示(配置取自website)。
find_package (Boost COMPONENTS system filesystem unit_test_framework REQUIRED)
add_definitions (-DBOOST_TEST_DYN_LINK)
include_directories (../include ${Boost_INCLUDE_DIRS})
file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp)
foreach(testSrc ${TEST_SRCS})
get_filename_component(testName ${testSrc} NAME_WE)
add_executable(${testName} ${testSrc})
target_link_libraries(${testName} ${Boost_LIBRARIES} my_lib)
set_target_properties(${testName} PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/testBin)
add_test(NAME ${testName}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/testBin
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/testBin/${testName}
)
endforeach(testSrc)
生成的cmake-build-debug/Makefile 的test 目标如下所示。
# Special rule for the target test
test:
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..."
/usr/bin/ctest --force-new-ctest-process $(ARGS)
.PHONY : test
# Special rule for the target test
test/fast: test
.PHONY : test/fast
生成的cmake-build-debug/CTestTestfile.cmake 如下所示。
subdirs("src")
subdirs("tests")
生成的cmake-build-debug/src/CTestTestfile.cmake为空,但cmake-build-debug/tests/CTestTestfile.cmake有如下内容。 tests目录下还有更多的test_XYZ.cpp类,但是这里没有添加。
add_test(test_Dummy "/path/to/git/my_lib/tests/testBin/test_Dummy")
set_tests_properties(test_Dummy PROPERTIES WORKING_DIRECTORY "/path/to/git/my_lib/tests/testBin")
关于我做错了什么有什么想法吗?
【问题讨论】:
-
我注意到的一件事是您只需要在
add_test()命令中指定目标name:COMMAND ${testName}。在这种情况下,CMake 会自动解析目标位置。您可能会尝试将测试本身命名为与您正在测试的目标不同的名称。除此之外,查看您的 CTestTestfile.cmake 文件(如果已生成)也可能会有所帮助。 -
subdirs("src")inCTestTestfile.cmake表示进入目录并在其中查找相同的文件。子目录中CTestTestfile.cmake的内容是什么? -
将
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/testBin/${testName}更改为COMMAND ${testName}不会改变行为。 -
@Tsyvarev 我添加了额外的
CTestTestfile.cmake内容。您对这些文件的提示显示只添加了 1 个测试。 -
尝试在
add_subdirectory之前移动enable_testing()。可以肯定的是,您没有在任何地方设置BUILD_TESTING?使用message(STATUS ..)进行调试。${TEST_SRCS}是否包含正确的列表?${testName}是否包含正确的名称?在某些地方插入message(STATUS ${TEST_SRCS})${testName}),并在cmake进行配置时查看输出。您是否尝试删除 cmake 缓存文件并重新创建所有文件?
标签: c++ unit-testing cmake