我想测试一个应用程序是否同时以非零代码退出并输出特定字符串。我这样设置属性:
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,另一个不设置。