【问题标题】:How do I configure my CMake project to run all unit tests?如何配置我的 CMake 项目以运行所有单元测试?
【发布时间】:2020-01-29 22:07:44
【问题描述】:

我有一个使用 cmake 作为构建工具的 C++ 项目。我的目录结构如下所示。

. ├── cmake-build-debug ├── 包括 ├── 源 └── 测试

当我在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/Makefiletest 目标如下所示。

# 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() 命令中指定目标nameCOMMAND ${testName}。在这种情况下,CMake 会自动解析目标位置。您可能会尝试将测试本身命名为与您正在测试的目标不同的名称。除此之外,查看您的 CTestTestfile.cmake 文件(如果已生成)也可能会有所帮助。
  • subdirs("src") in CTestTestfile.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


【解决方案1】:

enable_testing() 在它之后启用add_test()。因此,请确保在您要启用的任何 add_test() 之前调用 enable_testing()

【讨论】:

    猜你喜欢
    • 2011-04-28
    • 2020-01-16
    • 1970-01-01
    • 2013-04-03
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2010-11-05
    相关资源
    最近更新 更多