如果在单个测试中超过时间限制,RSpec测试运行如何失败?

问题描述:

使用ruby RSpec测试套件很懒惰,并且使用db方式而不是嘲笑事情。我试图在持续集成构建中添加一个脚本,如果有任何测试运行结束,比如5秒,构建应该失败。如果在单个测试中超过时间限制,RSpec测试运行如何失败?

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

  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 

出了毛病,我卡最放在了第一位。有什么建议么?

你可能只使用awk。我不熟悉rspec的输出,所以我发明了一个有意义的。 这里将是一个可能的解决方案是将打印一切,但是当它检测与XY秒行,然后它是否应该退出,将评价:

{ 
    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()以内的正则表达式替换输出中更好的正则表达式。