在ctest中,如何检查非零退出代码和特定字符串输出



我想测试一个应用程序是否同时以非零代码退出并输出特定字符串。我这样设置属性:

set_tests_properties(
myapp-test-foobar
PROPERTIES
WILL_FAIL TRUE
FAIL_REGULAR_EXPRESSION "^Usage: myapp"
)

但是,即使应用程序的退出代码为0,测试也会通过。尽管WILL_FAIL是必要的,否则当FRE匹配时测试将失败,但退出代码将被忽略。我在cmake文档中查找答案,但没有结果。

EDIT:事实证明,如果设置了PASS_REGULAR_EXPRESSION或FAIL_REGULAR_EXPRESSION,ctest(我使用的是v3.19.2(不会检查退出代码。通过或失败条件仅由RE匹配来满足。

因此,我的一个应用程序中出现了一个令人讨厌的bug。

编辑:下面评论中建议的答案是用于处理在测试的错误条件下中止(即崩溃(的应用程序,因此与我的情况不同。请参阅我下面的评论,了解进一步的推理和解决方案。

我在上面的评论中描述的修复程序不起作用。正如我最近发现的,不匹配的FAIL_REGULAR_EXPRESSION不会导致测试失败。请参阅此问题。

这是因为当设置FAIL_REGULAR_EXPRESSION和WILL_FAIL时,ctest执行

if (match FAIL_REGULAR_EXPRESSION || exit_code != 0)

为了清楚起见,以下是其他情况。当仅设置WILL_FAIL时,ctest执行

if (exit_code != 0)

设置PASS_REGULAR_EXPRESSION时,ctest执行

if (match PASS_REGULAR_EXPRESSION)

当3个都没有设置时,ctest执行

if (exit_code == 0)

您可以通过在以下中滥用PASS_REGULAR_EXPRESSION来测试正确的错误代码和错误消息

add_test( NAME myapp-test-ktx2-in-exit-code
COMMAND myapp -o foo infile.ktx2
WORKING_DIRECTORY ${MY_WORK_DIR}
)
set_tests_properties(
myapp-test-ktx2-in-exit-code
PROPERTIES
WILL_FAIL TRUE
)
add_test( NAME myapp-test-ktx2-in
COMMAND myapp -o foo input.ktx2
WORKING_DIRECTORY ${MY_WORK_DIR}
)
set_tests_properties(
myapp-test-ktx2-in
PROPERTIES
PASS_REGULAR_EXPRESSION ".* is not a KTX v1 file."
)

如果两个测试都通过,我们可以保证我们有一个非零的退出代码,并且错误消息与PASS_REGULAR_EXPRESSION匹配。

如果要同时测试正确的PASS_REGULAR_EXPRESSION和exit_code==0,同样需要两个测试:一个测试PASS_REGULAR_EXPRESSION,另一个不设置。

相关内容

  • 没有找到相关文章

最新更新