如果超过一次测试超过时间限制,如何使RSpec测试运行失败?

时间:2016-12-16 21:20:50

标签: bash unix awk rspec grep

使用ruby RSpec测试套件很容易变得很懒,并且使用db方式而不是嘲笑东西。我正在尝试在持续集成构建中添加一个脚本,如果任何测试运行,比如5秒,则构建应该失败。

这是我到目前为止的方向。

  1. 使用RSpec的--profile选项

  2. 吹出秒针。

  3. 如果任何秒数超过某个限制则失败。

  4. 这是我到目前为止的WIP命令:

    rspec spec/models/user_spec.rb --profile | \
    tee /dev/tty | \
    grep '[0-9] seconds ./' | \
    grep -oEi '[0-9]+\.[0-9]+' | \
    awk '$1 > 5.0' \
    

    问题

    • 这只会awk输出数字。如果在构建过程中失败了,我们就不知道哪个档案是罪犯。

    • 管道失败似乎很尴尬。

    我会这样做(但必须有更好的方法):

    if $(rspec spec... awk ...) > /dev/null ; then exit 1 ; fi
    

    出于问题,我在第一个问题上遇到的问题最多。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

你可能只使用awk。我不熟悉rspec输出,所以我发明了一个有意义的。 这将是一个可能的解决方案,将打印所有内容,但当它检测到X.Y秒的行时,它将评估是否应该退出:

{
    echo "Running step 4."
    echo "Processing 4.0 seconds."
    echo "Running step 5."
    echo "Processing 5.0 seconds."
    echo "Running step 5.1."
    echo "Processing 5.1 seconds."
    echo "Running step 6."
    echo "Processing 6.0 seconds."
} | awk '{ print; 
           var=substr($0, match($0, /[0-9]+\.[0-9]+ seconds\./), 3)
           if (var ~ /[0-9]+\.[0-9]+/ && var >= 5) { 
               print "Stop here! It took to long.", var; 
               exit 123 }
         }'

结果将是:

Running step 4.
Processing 4.0 seconds.
Running step 5.
Processing 5.0 seconds.
Stop here! It took to long. 5.0

awk存在一个奇怪的转换问题,但在您的情况下可能不那么重要。

您可以使用更好的输出来替换match()内的正则表达式。