2016-12-16 75 views
-1

使用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 

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

回答

0

你可能只使用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()以內的正則表達式替換輸出中更好的正則表達式。