【问题标题】:How to fail RSpec test run if over a single test runs over time limit?如果超过单个测试超过时间限制,如何使 RSpec 测试运行失败?
【发布时间】:2016-12-16 21:20:50
【问题描述】:

使用 ruby​​ RSpec 测试套件很容易变得懒惰,并且过多地使用 db 而不是模拟事物。我正在尝试在持续集成构建中添加一个脚本,如果任何测试运行超过 5 秒,构建应该会失败。

这是我目前要去的方向。

  1. 使用 RSpec 的 --profile 选项

  2. Grep 秒了。

  3. 如果任何秒数超过特定限制,则失败。

这是我目前的 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

在所有问题中,我最卡在第一个问题上。有什么建议吗?

【问题讨论】:

    标签: bash unix awk rspec grep


    【解决方案1】:

    您可以只使用 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() 内部的正则表达式替换为更好的输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      相关资源
      最近更新 更多