我想编写一个简单的测试,如果所有指定的模式都在输出中,则该测试成功。
具体来说,我正在测试程序是否正确使用配置文件进行自我配置。当我只有一个参数时,这种方法很好用,但是现在我要对多个参数执行相同的操作,而且现在看来我需要走不太快和较脏的方式了,因为如果任何一个模式都匹配,而不是全部匹配,则grep成功。
该程序:
logger_ << yaaf::LogLevel::info << "intParam is " << get_parameters().intParam << std::endl;
logger_ << yaaf::LogLevel::info << "boolParam is " << get_parameters().boolParam << std::endl;
logger_ << yaaf::LogLevel::info << "charParam is " << get_parameters().charParam << std::endl;
logger_ << yaaf::LogLevel::info << "floatParam is " << get_parameters().floatParam << std::endl;
logger_ << yaaf::LogLevel::info << "doubleParam is " << get_parameters().doubleParam << std::endl;
logger_ << yaaf::LogLevel::info << "longParam is " << get_parameters().longParam << std::endl;
logger_ << yaaf::LogLevel::info << "uintParam is " << get_parameters().uintParam << std::endl;
logger_ << yaaf::LogLevel::info << "ulongParam is " << get_parameters().ulongParam << std::endl;
logger_ << yaaf::LogLevel::info << "stringParam is " << get_parameters().stringParam << std::endl;
当前测试:
timeout 3 ${ini_test} | grep 'intParam is 1'
timeout 3 ${ini_test} -i ${workspace}/tests/eclipseProject/algos/testsIni/initest.ini | grep 'intParam is 2'
什么不起作用:
timeout 3 ${ini_test} | grep -e 'intParam is 1' -e 'boolParam is false' -e 'charParam is a' [and so on...]
不起作用,因为如果任何模式匹配,grep将以代码0退出。如果所有模式都可以与输出匹配,我希望它返回0 。
对于这种情况,我可能只会编写一些python代码来完成我想要的事情,但这种情况可能会在将来或其他情况下再次出现。我该如何解决这个问题?
Grep将为您OR
提供-e
表达式的并()。您可以通过链接类似的问题来解决此问题,|grep … |grep … |grep …
但是我看到您的表达式都是纯文本而不是正则表达式,因此这是一个更快的awk解决方案:
timeout 3 ${ini_test} | awk '
function in(s) { return index($0, s) }
in("intParam is 1") && in("boolParam is false") && in("charParam is a") {
print
retval = 1
}
END { if (retval != 1) exit 1 }
'
我在这里定义了一个函数,以使其更清晰(假设您的“等等”字样,您有很多测试)。如果没有该功能,如何执行此操作应该很明显。
AWKindex(string, substring)
为您substring
提供给定string
或零的索引(awk字符串未为零索引),因此,如果任何请求的子字符串不匹配,则index()
返回零和条件短路。index()
根据我的经验,AWK比快得多grep -F
。
AWK总是退出0
(true),除非在END
节中明确要求这样做。exit
如果足以停止评估,则可以在另一个节的末尾添加一个额外的内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句