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

CTest设置WILL_FAIL后FAIL_REGULAR_EXPRESSION不匹配仍通过原因

问题描述

在.cmake文件中添加如下配置,为CTest注册了一个简单测试:

add_test( NAME ktxsc-test-many-in-one-out
    COMMAND ktxsc -o foo a.ktx2 b.ktx2 c.ktx2
)
set_tests_properties(
    ktxsc-test-many-in-one-out
PROPERTIES
    WILL_FAIL TRUE
    FAIL_REGULAR_EXPRESSION "^Can't use -o when there are multiple infiles."
)

配置完成后测试运行通过,TestLog输出内容如下:

----------------------------------------------------------
Test Pass Reason:
Error regular expression found in output. Regex=[^Can't use -o when there are multiple infiles.]
"ktxsc-test-many-in-one-out" end time: Jun 30 16:34 JST
"ktxsc-test-many-in-one-out" time elapsed: 00:00:00
----------------------------------------------------------

将FAIL_REGULAR_EXPRESSION属性值修改为无意义字符串"some rubbish"后,即便测试程序打印的错误信息和之前完全一致,测试依然会判定为通过,此时TestLog输出如下:

----------------------------------------------------------
Test Passed.
"ktxsc-test-many-in-one-out" end time: Jun 30 16:53 JST
"ktxsc-test-many-in-one-out" time elapsed: 00:00:00
----------------------------------------------------------

该日志表现是未设置任何*_REGULAR_EXPRESSION测试属性时的默认输出,需要明确该现象产生的原因,以及如何配置CTest,才能在FAIL_REGULAR_EXPRESSION未匹配到测试输出时判定测试失败。

现象原因

该现象由CTest默认的测试判定逻辑导致,核心规则如下:

  1. CTest会先计算测试的原始结果,再根据WILL_FAIL属性决定是否反转结果:如果WILL_FAIL=TRUE,原始失败会被转为最终通过,原始通过会被转为最终失败。
  2. 原始结果的判定优先级从高到低为:
    • 如果输出匹配FAIL_REGULAR_EXPRESSION,直接判定原始失败
    • 如果设置了PASS_REGULAR_EXPRESSION,输出必须匹配对应正则才会判定原始通过,未匹配则直接判定原始失败,不受进程退出码影响
    • 如果没有设置PASS_REGULAR_EXPRESSION,进程退出码为0则原始通过,非0则原始失败

对应两种测试结果的逻辑:

  • 初始配置下,测试输出匹配到了正确的FAIL_REGULAR_EXPRESSION,原始结果为失败,经WILL_FAIL=TRUE反转后最终通过,日志会明确记录正则匹配的判定原因。
  • 修改正则为无意义字符串后,输出无法匹配该正则,此时程序执行出错返回非0退出码,原始结果依然为失败,经WILL_FAIL=TRUE反转后还是最终通过。因为这次原始失败的原因是退出码非0,和正则校验无关,所以日志是无正则规则时的默认通过输出。

这种配置下FAIL_REGULAR_EXPRESSION只是可选的失败触发条件之一,不是必须满足的校验项,只要程序返回非0退出码,不管正则有没有匹配,都会被WILL_FAIL判定为通过。

正确配置方法

要实现「指定正则未匹配到测试输出时判定测试失败」的效果,不需要使用FAIL_REGULAR_EXPRESSION+WILL_FAIL的组合,直接用PASS_REGULAR_EXPRESSION指定必须匹配的预期输出即可,配置如下:

add_test( NAME ktxsc-test-many-in-one-out
    COMMAND ktxsc -o foo a.ktx2 b.ktx2 c.ktx2
)
set_tests_properties(
    ktxsc-test-many-in-one-out
PROPERTIES
    PASS_REGULAR_EXPRESSION "^Can't use -o when there are multiple infiles."
)

该配置的判定逻辑完全符合需求:

  • 只要测试输出匹配到指定的错误提示,不管程序返回什么退出码,都会判定为通过
  • 只要测试输出没有匹配到指定错误提示,不管程序返回0还是非0退出码,都会判定为失败
  • 不需要额外设置WILL_FAIL属性,PASS_REGULAR_EXPRESSION的校验优先级高于退出码判断,不会出现正则未匹配但误判通过的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:06:22