如何用CTest同时检测程序非零退出及指定错误输出
解决CTest同时验证非零退出码与错误输出的问题
你遇到的核心问题是:cat nonexistent的错误信息输出到了标准错误(stderr),而CTest默认的PASS_REGULAR_EXPRESSION只检查标准输出(stdout)。当你同时设置WILL_FAIL和PASS_REGULAR_EXPRESSION时,CTest会判定命令退出状态符合要求,但stdout中找不到匹配的正则,因此整体测试失败。
完全可以在单个测试中同时完成非零退出码和指定错误输出的检查,只需针对stderr的捕获做调整,有两种可行方案:
方案一:重定向stderr到stdout
将命令的stderr输出重定向到stdout,让PASS_REGULAR_EXPRESSION能捕获到错误信息:
cmake_minimum_required(VERSION 3.15) project(failing-test) enable_testing() # 通过shell重定向stderr到stdout add_test(NAME failing-test COMMAND sh -c "cat nonexistent 2>&1") set_property(TEST failing-test PROPERTY WILL_FAIL true) set_property(TEST failing-test PROPERTY PASS_REGULAR_EXPRESSION "cat: nonexistent: No such file or directory")
方案二:使用ERROR_REGULAR_EXPRESSION属性
CTest提供了专门匹配stderr输出的ERROR_REGULAR_EXPRESSION属性,无需重定向即可直接检查错误信息:
cmake_minimum_required(VERSION 3.15) project(failing-test) enable_testing() add_test(NAME failing-test COMMAND cat nonexistent) set_property(TEST failing-test PROPERTY WILL_FAIL true) # 用ERROR_REGULAR_EXPRESSION匹配stderr内容 set_property(TEST failing-test PROPERTY ERROR_REGULAR_EXPRESSION "cat: nonexistent: No such file or directory")
验证效果
使用任意一种方案修改后,重新执行测试命令:
mkdir build && cd build cmake .. ctest
测试会正常通过,因为CTest同时验证了两个条件:
- 命令返回非零退出码(符合
WILL_FAIL属性要求) - 错误输出(stderr)匹配指定的正则表达式
不需要拆分两个测试,单个测试即可完成全部验证。
内容的提问来源于stack exchange,提问作者Krzysiek Karbowiak
相关产品推荐
相关产品推荐

