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

如何在CMake+GoogleTest项目中运行指定测试?

如何通过CMake命令行指定运行GoogleTest中的特定模块测试

问题分析

你当前的项目将所有测试编译为单个可执行文件,随着模块增多,需要快速运行特定模块(如thing2)的测试。之前的CMake配置尝试通过自定义target实现,但因变量仅在CMake配置阶段生效,导致无法灵活切换测试模块。

有效解决方案

方案1:直接运行测试可执行文件(最灵活)

编译完成后,直接在命令行给测试可执行文件传递GoogleTest的过滤参数:

# 运行所有测试
./tests
# 仅运行thing2相关测试(匹配所有以thing2开头的测试案例)
./tests --gtest_filter=thing2*
# 仅运行thing2模块下的某个具体测试用例
./tests --gtest_filter=thing2.TestCaseName

方案2:使用ctest匹配测试名称

由于你用了gtest_discover_tests,CMake会将每个GoogleTest测试案例单独注册为ctest测试项,因此可以用ctest的正则匹配参数:

# 运行所有测试
ctest
# 仅运行名称包含thing2的测试
ctest -R thing2

注:-R参数支持正则表达式,比如ctest -R "^thing2"可以精准匹配以thing2开头的测试。

方案3:创建灵活的CMake自定义Target

修改tests/CMakeLists.txt,添加一个支持动态传递过滤规则的自定义target:

# 定义缓存变量,用于传递测试过滤规则,默认空(运行所有测试)
set(GTEST_FILTER "" CACHE STRING "GoogleTest过滤规则,例如:thing2*")

add_custom_target(run_tests
    COMMAND ${This} --gtest_filter=${GTEST_FILTER}
    DEPENDS ${This}
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)

# 确保每次运行run_tests时,重新读取GTEST_FILTER变量,无需重新配置整个项目
set_property(TARGET run_tests PROPERTY CMAKE_CONFIGURE_DEPENDS ${CMAKE_CURRENT_LIST_FILE})

使用时,通过-DGTEST_FILTER参数指定规则:

# 运行thing2相关测试
cmake --build . --target run_tests -DGTEST_FILTER=thing2*
# 运行所有测试(不指定或设为空)
cmake --build . --target run_tests

之前配置的问题说明

你之前的方案中:

  1. RUN_SPECIFIC_TESTS是CMake option,一旦设置为ON会被缓存,后续需要手动清除缓存才能修改。
  2. TEST_PREFIX的值在CMake配置阶段确定,每次切换测试模块都要重新运行cmake配置,无法在构建阶段动态修改。
    这两个问题导致配置无法灵活满足快速切换测试模块的需求。

内容的提问来源于stack exchange,提问作者Lachlan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 11:24:50