如何让Catch2测试在每次CMake项目重建后自动运行?
在CMake+Catch2项目中实现构建自动运行测试
问题描述
我有使用Rust和Cargo的经验,Cargo默认会在每次构建时自动运行测试,非常便捷。请问是否可以在使用CMake和Catch2的C++项目中实现类似的行为?
项目结构:
. ├── CMakeLists.txt ├── LICENSE ├── README.md ├── library.properties ├── src │ ├── math.hpp │ ├── prelude.hpp │ ├── signal.hpp │ └── sm.hpp └── test ├── CMakeLists.txt └── prelude_test.cpp
根目录CMakeLists.txt:
cmake_minimum_required(VERSION 3.11) project( efp VERSION 0.1 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED On) find_package(Catch2 3 REQUIRED) include(CTest) include(Catch) enable_testing() add_library(efp INTERFACE) target_include_directories(efp INTERFACE "./src") add_subdirectory("./test")
测试目录test/CMakeLists.txt:
add_executable(prelude_test prelude_test.cpp) target_link_libraries(prelude_test PRIVATE Catch2::Catch2WithMain efp) catch_discover_tests(prelude_test)
实现方案
方案一:全局构建自动运行所有测试
修改根目录的CMakeLists.txt,在末尾添加以下代码,创建一个默认执行的自定义目标,绑定测试构建与运行:
# 获取测试目录下的所有可执行目标 get_property(TEST_EXECUTABLES DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test PROPERTY BUILDSYSTEM_TARGETS) # 创建自动运行测试的目标,加入默认构建流程 add_custom_target(run_tests ALL COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure DEPENDS ${TEST_EXECUTABLES} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMENT "Running all tests..." )
ALL关键字让该目标随默认构建命令(如make/ninja)自动执行DEPENDS确保所有测试可执行文件先编译完成,再运行测试${CMAKE_CTEST_COMMAND}会调用CMake的测试框架,自动识别catch_discover_tests注册的用例,--output-on-failure在测试失败时展示详细输出
方案二:单个测试构建后自动运行
如果只想让特定测试在编译后自动执行,修改test/CMakeLists.txt,在现有代码后添加:
# 构建完成后自动运行当前测试 add_custom_command( TARGET prelude_test POST_BUILD COMMAND prelude_test COMMENT "Running prelude_test..." )
POST_BUILD指定命令在测试可执行文件编译完成后立即执行- 直接调用测试程序,无需通过CTest包装,适合快速验证单个测试模块
使用说明
- 执行默认构建命令(
cmake --build .、make或ninja)时,测试会自动运行 - 若需临时跳过测试,可指定构建核心库目标:
cmake --build . --target efp - 方案一的CTest输出会包含所有测试用例的结构化结果,方便查看整体测试状态
内容的提问来源于stack exchange,提问作者lighthouse
相关产品推荐
相关产品推荐

