10、add_test命令:add_test基本用法、测试名称与命令、传递参数给测试

好,咱们今天来聊聊 add_test 这个命令。说实话,在 CMake 的测试体系里,它是最基础、最核心的一个命令。没有它,CTest 就不知道要跑什么。我刚开始用 CMake 做测试时,第一件事就是搞清楚这个命令怎么用。

add_test 的基本用法

先看最简单的形式。你只需要告诉 CMake:我要注册一个测试,它叫什么名字,执行什么命令。

add_test(NAME MyTest COMMAND my_test_executable)

这行代码干了三件事:

  • 给测试起个名字,叫 MyTest
  • 指定要运行的可执行文件是 my_test_executable
  • 把这个测试注册到 CTest 的测试列表中

嗯,这里要注意:my_test_executable 必须是一个已经构建好的可执行文件。通常我们会用 add_executable 先创建它,然后再用 add_test 注册。

核心要点:add_test 只是注册,不会帮你编译。你得确保测试程序已经构建好了。

测试名称与命令

测试名称最好起得有意义。我见过有人用 test1test2 这种名字,结果跑测试时根本不知道哪个失败了。我个人习惯用 模块名_功能名 的格式,比如:

add_test(NAME math_add_test COMMAND test_math_add)
add_test(NAME math_sub_test COMMAND test_math_sub)
add_test(NAME string_trim_test COMMAND test_string_trim)

这样一目了然。CTest 运行时会显示这些名字,方便你定位问题。

命令部分,除了可执行文件,还可以是任何可执行的脚本或工具。比如:

add_test(NAME python_test COMMAND python3 ${CMAKE_CURRENT_SOURCE_DIR}/run_test.py)

说白了,只要是个能跑的命令,都可以作为测试。

传递参数给测试

很多时候,测试程序需要接收参数。比如指定配置文件、设置运行模式、或者传入测试数据路径。这时候可以用 COMMAND 后面直接跟参数:

add_test(NAME config_test 
  COMMAND test_config --config ${CMAKE_CURRENT_SOURCE_DIR}/config.json --verbose)

参数之间用空格分隔,CMake 会原样传递给测试程序。我在项目中遇到过一个问题:参数里包含空格怎么办?比如路径是 C:\Program Files\data。这时候要用引号包起来:

add_test(NAME path_test 
  COMMAND test_path "${CMAKE_CURRENT_SOURCE_DIR}/my data/file.txt")

CMake 会正确处理引号内的内容,把它当作一个整体参数传递。

小技巧:如果你有多个参数,可以用变量来组织,代码更清晰:

set(TEST_ARGS "--input" "data.txt" "--output" "result.txt" "--mode" "fast")
add_test(NAME data_process_test COMMAND test_process ${TEST_ARGS})

一个完整的例子

咱们来看一个实际项目中的用法。假设你有一个数学库,要测试加法、减法、乘法:

# 先构建测试程序
add_executable(test_math test_math.cpp)
target_link_libraries(test_math PRIVATE math_lib)

# 注册测试,并传递参数
add_test(NAME math_add_test 
  COMMAND test_math --operation add --iterations 1000)
add_test(NAME math_sub_test 
  COMMAND test_math --operation sub --iterations 1000)
add_test(NAME math_mul_test 
  COMMAND test_math --operation mul --iterations 5000)

这样,同一个测试程序 test_math 通过不同参数,覆盖了多个测试场景。你想想看,如果每个测试都写一个单独的可执行文件,那维护起来多麻烦。

知识结构图

下面这张图总结了 add_test 的核心逻辑:

add_test 命令知识结构 基本用法 NAME + COMMAND 注册测试到CTest 可执行文件或脚本 测试名称与命令 有意义的命名 模块名_功能名 支持任何可执行命令 传递参数 COMMAND 后直接跟参数 空格分隔多个参数 引号处理含空格的参数 核心原则:先构建,后注册,参数清晰,命名规范 常见错误 忘记构建测试程序 → CTest 报错找不到可执行文件 参数中空格未处理 → 测试程序收到错误参数

避坑指南

我曾经踩过的坑:

  • 忘记链接库:测试程序编译通过了,但运行时崩溃。后来发现是忘了 target_link_libraries。测试程序也是程序,该链接的库一个都不能少。
  • 路径问题:测试程序里用了相对路径,但 CTest 的工作目录不一定是源码目录。我建议用 ${CMAKE_CURRENT_SOURCE_DIR}${CMAKE_CURRENT_BINARY_DIR} 来构造绝对路径。
  • 参数顺序:CMake 的 COMMAND 后面,第一个参数是可执行文件,后面才是参数。别把参数写到可执行文件前面去了。

总结一下

add_test 虽然简单,但用好了能省不少事。记住三点:

  • 测试名称要有意义,方便定位问题
  • 命令可以是可执行文件,也可以是脚本
  • 参数传递要小心空格和路径问题

掌握了这些,你的测试框架就有了坚实的基础。接下来就可以用 CTest 来批量运行这些测试了。


公众号:蓝海资料掘金营,微信deep3321