l

2023年3月21日 星期二

使用ezSpec落實行為驅動開發與實例化需求(4):在Scenario中使用表格

March 21 05:40~6:45

▲圖1:使用ezSpec在Scenario中讀取單一表格資料範例,表格內容取自《BDD in Action》一書

 

前言

上一集介紹如何使用ezSpec撰寫Scenario、從Step描述文字內容中讀取參數、以及在不同的Step Definition之間傳遞資料的方法(請參考<使用ezSpec落實行為驅動開發與實例化需求(3):撰寫Scenario與傳遞簡單參數>),今天介紹如何在Scenario中讀取表格資料。

***

讀取單一表格

請參考圖1的85~87行,ezSpec支援Gherkin的表格,以 | 符號分隔不同的column。通常表格的第一列為表頭,之後每一列為表格內容。ezSpec支援兩種讀取表格的方式:

  • row(int).get(column_name):第一種讀取表格方式請參考圖1的88~90行,env.row(0)拿到表格中第一個row,也就是 |    Jill    |   100,000     |   800           |   這一組資料。接著可以用get(column_name)拿到這個row中不同column的資料,例如 env.row(0).get("owner")拿到Jill。
  • row(first_column_data_in_each_row).get(column_name):圖1的93~95行展示第二種讀取表格方式,用每一個row第一個column的資料當作key,使用env.row(first_column_data_in_each_row)的方式定位到所要讀取的該筆row,然後再用get(column_name)拿到這個row中不同column的資料。例如env.row("Jow").get("points")拿到50,000。

使用表格可以一次指定多筆測試資料,提高Scenario的可讀性。

***

讀取多個表格

你也可以在一個Scenario中使用多個表格,例如把一個表格當作Given裡面的輸入資料,另一個表格放在Then裡面當作expected result,請參考圖2。

讀取多個表格資料的方式與讀取單一表格相同,但有一點需要注意:「在ezSpec中,一個Scenario同一時間最多只會有一個Active Table。」在圖1中由於該Scenario只定義了一個表格,因此一但表格定義之後,在接下來的Step Definition(Given-When-Then-And)中都可以讀到該表格的資料。在圖2中,第一個表格定義在Given,第二個表格定義在Then。因此Given以及When會讀到第一個表格的資料,而Then則是讀到第二個表格的資料,請參考圖2第171~172行(後面定義的表格會蓋掉上一個定義的表格)。


▲圖2:使用ezSpec在Scenario中讀取多個表格資料範例,表格內容取自《BDD in Action》一書

***

結語

這兩集介紹在ezSpec中撰寫Scenario的方式,有使用過Cucumber、SpecFlow或JBehave的鄉民,應該可以很明顯發現兩者的不同之處。因為ezSpec是一種Internal DSL,使用「類Gherkin語法」以Java程式語言採用Specification by Example的方式,用例子(Scenario)來表達規格。

ezSpec的Step Definition以Lambda實作,和其相對應的Step直接綁定,不需要因為Step的文字內容改變而重新產生一個新的Step Definition,可以讓開發人員專心在撰寫Scenario上面,少掉很多工具所帶來的干擾。

採用BDD或Specification by Example的開發方式,經常會產生「執行步驟相同但驗證資料不同的Scenario」,此時就可以用下一集介紹Scenario Outline來簡化這些相似的Scenario。

***

友藏內心獨白:一表值千言。

沒有留言:

張貼留言