You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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命令。

二、源码层面自定义默认行为(更灵活的命令行控制)

如果需要更灵活的命令行选项,比如用--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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 16:05:22