我写了fuzzy测试,但是测试失败了。我添加了一些调试代码,但现在我想运行测试直到它失败,所以我可以收集调试输出。
我已经设置了测试,因此我可以使用以下命令运行它:
./runtest
我目前的解决方案是编写untilfail
脚本:
#!/bin/bash
$@
while [ $? -eq 0 ]; do
$@
done
然后使用它:
untilfail ./runtest
是否有更简单的解决方案?
答案 0 :(得分:274)
while
执行命令,因此您可以使用更简单的
while ./runtest; do :; done
当./runtest
返回非零退出代码(这通常表示失败)时,这将停止循环。
为了进一步简化您当前的解决方案,您应该将untilfail脚本更改为如下所示:
#!/bin/bash
while $@; do :; done
然后你可以用你已经使用的任何命令调用它:
untilfail ./runTest --and val1,val2 -o option1
答案 1 :(得分:5)
如果您不想将复杂的管道线包装到shell脚本或函数中,那么这将起作用:
while true; do
curl -s "https:..." | grep "HasErrors.:true"
if [[ "$?" -ne 0 ]]; then
break
fi
sleep 120
done
在这种情况下,HTTP请求总是返回200,但也返回一些具有属性“HasErrors”的JSON:当出现错误时为true。
答案 2 :(得分:1)
在一个系统中有一个类似的问题,该系统的shell重试逻辑到处都是重复的,我制作了专用工具来解决这个问题,称为“ retry”:
retry --until=fail ./runtest
一个更复杂的示例:
retry --until=fail --message="test succeeded" --delay=1 ./runtest
可从https://github.com/minfrin/retry获得的工具。