如何让Catch2基准测试默认不被ctest执行(改为运行时按需启用)
解决Catch2基准测试默认跳过、按需启用的实用方案
一、通过CMake配置实现默认跳过,支持按需切换
这是最适配CLion和CI场景的方案,无需修改源码,纯CMake配置就能实现默认跳过基准测试,同时保留按需启用的能力:
# 添加CMake选项,控制基准测试是否默认启用(默认关闭) option(ENABLE_BENCHMARKS "Enable benchmarks by default" OFF) # 假设你的测试可执行文件目标为my_test add_executable(my_test test_main.cpp) target_link_libraries(my_test PRIVATE Catch2::Catch2WithMain) # 设置测试用例的默认执行参数 set(test_default_args "") if(NOT ENABLE_BENCHMARKS) set(test_default_args "--skip-benchmarks") endif() # 注册测试用例,传入默认参数 add_test( NAME my_test COMMAND my_test ${test_default_args} ) # 允许通过命令行临时覆盖默认参数 set_tests_properties(my_test PROPERTIES ALLOW_RESTART ON )
使用说明:
- 默认行为:克隆项目后,CMake默认关闭
ENABLE_BENCHMARKS,CLion调用ctest时会自动跳过基准测试,无需额外配置。 - 按需运行基准测试:
- 开发时:在CLion的CMake配置中添加
-DENABLE_BENCHMARKS=ON,重新加载CMake后,ctest会默认运行基准测试;也可临时执行ctest -R my_test --test-command "./my_test"(直接指定不带跳过参数的命令)。 - CI环境:若需运行基准测试,只需在CMake构建前执行
cmake .. -DENABLE_BENCHMARKS=ON,无需修改ctest命令。
- 开发时:在CLion的CMake配置中添加
二、源码层面自定义默认行为(更灵活的命令行控制)
如果需要更灵活的命令行选项,比如用--run-benchmarks显式启用基准测试,可以修改测试入口的main函数:
#define CATCH_CONFIG_MAIN #include <catch2/catch_all.hpp> int main(int argc, char* argv[]) { Catch::Session session; bool run_benchmarks = false; // 自定义命令行选项:--run-benchmarks 显式启用基准测试 auto cli = session.cli() | Opt(run_benchmarks)["--run-benchmarks"]("Explicitly run benchmarks (default: skip)"); session.cli(cli); int return_code = session.applyCommandLine(argc, argv); if (return_code != 0) return return_code; // 默认跳过基准测试,除非用户指定--run-benchmarks if (!run_benchmarks) { session.config().setOption("skip-benchmarks", "true"); } return session.run(); }
使用说明:
- 日常开发和CI中,ctest默认跳过基准测试;
- 要运行基准测试时,执行
ctest -R my_test --test-command "./my_test --run-benchmarks"即可,无需重新编译。
三、ctest直接传参的临时方案
如果不想修改任何配置,也可以直接在运行ctest时指定测试命令的参数:
# 默认跳过基准测试(若测试默认不跳过) ctest -R my_test --test-command "./my_test --skip-benchmarks" # 临时运行基准测试 ctest -R my_test --test-command "./my_test"
这个方案适合临时调试,但不如前两个方案省心,每次都需要手动添加参数。
内容的提问来源于stack exchange,提问作者hak8or
相关产品推荐
相关产品推荐

