2017-03-09 85 views
0

目標: 我想知道在運行測試套件期間我有多少測試。如何awk滿足條件/省略一些行

我試圖獲得以BDD樣式編寫的測試場景的總數,並在控制檯中輸出該數字。 所有測試文件都在./features目錄中。有子目錄(所以我需要遞歸搜索) 一些測試註釋(使用#)

Simple scenario looks like that: 

    Scenario: blah-blah-blah 
    Given blah 
    When blah bloh 
    Then bluh bluh 

這是相當簡單的,而且還是一種魅力: grep -r "^\s*Scenario:" ./features/ | wc -l

棘手的部分是可以有有「場景大綱」關鍵字的測試。在測試的底部有一個帶有例子的表格。 方案可能看起來像:

Scenario Outline: blah 
    Given blah <score> 
    When bloh <performance> 
    Then blah-bloh-bluh <completion> 

    Examples: 
     | score | performance | completion | 
     | 4/4 | 100   | 50   | 
     | 3/4 | 75   | 50   | 
     | 4/4 | 100   | 5   | 

在第一行,我們已經得到了標題 - 我們不應該指望他們。所以,在這種情況下,我們有3個測試。 到目前爲止,我已經做了這樣的事情:

find ./features -type f -exec sed -n -e '/Scenario Outline/,/Scenario/ p' {} + | grep \| | wc -l

不幸的是有兩個問題我無法弄清楚:

  1. 我們正在檢查該「方案綱要」之間存在的表和「情景」。當「場景大綱」是文件中最後一個測試(沒有更多場景,只有EOF)時,我的解決方案與案例不匹配。
  2. 我用'|'來計算每一行不管有沒有真正的數據或表頭。

感謝您的每一個建議!

回答

1

我不確定管道是否可以出現在文件的其他任何位置,但是如果不是,則以下命令將計算從場景開始的所有行以及跳過第一行的所有錶行。

find ./features -type f -print0 | \ 
    xargs -0 awk '/^\s*Scenario:/; /\|/ { if (intable) print; intable=1 } intable && $0 !~ /\|/ { intable=0 }' | \ 
    wc -l