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

如何用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同时验证了两个条件:

  1. 命令返回非零退出码(符合WILL_FAIL属性要求)
  2. 错误输出(stderr)匹配指定的正则表达式

不需要拆分两个测试,单个测试即可完成全部验证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:27:42