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 只是注册,不会帮你编译。你得确保测试程序已经构建好了。
测试名称与命令
测试名称最好起得有意义。我见过有人用 test1、test2 这种名字,结果跑测试时根本不知道哪个失败了。我个人习惯用 模块名_功能名 的格式,比如:
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 的核心逻辑:
避坑指南
我曾经踩过的坑:
- 忘记链接库:测试程序编译通过了,但运行时崩溃。后来发现是忘了
target_link_libraries。测试程序也是程序,该链接的库一个都不能少。 - 路径问题:测试程序里用了相对路径,但 CTest 的工作目录不一定是源码目录。我建议用
${CMAKE_CURRENT_SOURCE_DIR}或${CMAKE_CURRENT_BINARY_DIR}来构造绝对路径。 - 参数顺序:CMake 的
COMMAND后面,第一个参数是可执行文件,后面才是参数。别把参数写到可执行文件前面去了。
总结一下
add_test 虽然简单,但用好了能省不少事。记住三点:
- 测试名称要有意义,方便定位问题
- 命令可以是可执行文件,也可以是脚本
- 参数传递要小心空格和路径问题
掌握了这些,你的测试框架就有了坚实的基础。接下来就可以用 CTest 来批量运行这些测试了。