我写下以下内容与Jenkins一起开始我的硒测试。现在,因为它们被作为后台进程执行,当它们失败时,Jenkins认为它们没有。正如你可以看到我徒劳地尝试这项工作。有任何想法吗?考虑将输出管道输出到文件中并使用grepping for keywords。然后我意识到如果字符串的grep返回true,我不知道如何反映错误。
#!/bin/bash
FAIL=0
echo "starting"
ruby /root/selenium-tests/test/test1.rb &
ruby /root/selenium-tests/test/test2.rb &
ruby /root/selenium-tests/test/test3.rb &
#wait
for job in `jobs -p`
do
echo $job
wait $job || let "FAIL+=1"
done
echo $FAIL
if [ "$FAIL" == "0" ];
then
echo "PASS"
else
echo "FAIL! ($FAIL)"
fi
答案 0 :(得分:3)
Jenkins很可能会查看进程退出代码以确定测试是否失败。这就是所有Unix工具的功能。
有多种方法可以做到这一点。如果您的测试文件输出类似“FAIL”的内容而不是正确返回退出代码,则可以执行以下操作:
#!/bin/bash
(
ruby /root/selenium-tests/test/test1.rb &
ruby /root/selenium-tests/test/test2.rb &
ruby /root/selenium-tests/test/test3.rb &
wait
) > log
! grep "FAIL" log
exit $? # <- happens implicitly at the end of the script, and can be left out
在这种情况下,grep
发现“FAIL”会导致脚本失败,Jenkins会检测到失败。
如果您的脚本返回正确的退出代码,更正确的方法是您的方法,但不依赖于作业控制(默认情况下在非交互式shell中关闭),并返回正确的退出代码:
for test in /root/selenium-tests/test/test*.rb
do
ruby "$test" &
pids+=( $! )
done
for pid in "${pids[@]}"
do
if wait $pid
then
echo "$pid succeeded"
else
echo "$pid failed"
(( failures++ ))
fi
done
if [[ $failures -gt 0 ]]
then
echo "FAIL: $failures failed tests"
exit 1 # return failure
else
echo "PASS!"
exit 0 # return success
fi