l

2023年3月20日 星期一

使用ezSpec落實行為驅動開發與實例化需求(3):撰寫Scenario與傳遞簡單參數

March 18 20:27~22:12;March 20 00:00~00:30



前言

介紹完ezSpec的領域模型(請考<使用ezSpec落實行為驅動開發與實例化需求(1):領域模型介紹>)與Feature和Story(請考<使用ezSpec落實行為驅動開發與實例化需求(2):Feature與Story>),終於要進入主題,今天介紹如何用ezSpec撰寫Scenario。

***

撰寫Scenario

假設你要開發一隻開發票的程式,可以從未稅金額計算含稅總價與稅金,你幫這隻程式寫的第一個Scenario如圖1所示:「當一台電腦的未稅金額為20000,營業稅為5%,當你買了這台電腦,你應該支付含稅金額21000的總價,其中1000元為營業稅。」

產生Scenario的方式很簡單,透過feature.withStory()找出事先建好的Story(請考<使用ezSpec落實行為驅動開發與實例化需求(2):Feature與Story>),然後呼叫Story身上的newScenario就可以產生一個新的Scenario。在產生Scenario的時候你可以指定這個Scenario的名字,如果未指定則ezSpec會自動抓取test method的名字當作Scenario的名字。

產生Scenario之後,可以透過它的Given、When、Then、And、But(統稱為Step)等method來撰寫Scenario的實際內容。每一個Step接受兩個參數:

  • 字串:用來描述Step內容的文字敘述。
  • Lambda:實際實行Step的程式,ezSpec使用Lambda來取代Cucumber的Step Definition。

由於本系列文章的主要目的是介紹ezSpec的使用方式,並不是要介紹透過TDD/BDD/SBE來開發軟體,所以接下來Teddy會說明撰寫Scenario的時候如何指定參數、讀取參數,以及傳遞參數的方式。

 

▲圖1:ezSpec的Scenario範例

***

指定與讀取無名參數

在圖1的範例中,一共有四個參數:

  • 第61行的未稅金額20,000
  • 第64行的營業稅5%
  • 第69行的含稅總價21,000
  • 第72行的營業稅1,000

有兩個方法可以在Step的Lambda中讀取這些參數,第一種方法是在這些參數前面加上$符號,Step的Lambda可以傳入一個ScenarioEnvironment的物件當成參數,可以透過ScenarioEnvironment在Lambda中讀取$開頭的字串,請參考圖2中的env參數。

 

▲圖2:ezSpec指定與讀取無名參數的Scenario範例

 

圖2示範三種讀取參數的函數:

  • 第62行evn.getArg:回傳String型別的參數
  • 第65行evn.getArgd:回傳double型別的參數
  • 第70行evn.getArgi:回傳int型別的參數

透過$方式所指定的參數,只有value,沒有key,因此在讀取時需透過index方式來讀取資料。在圖2中每一個Step剛好都只有一個參數,因此透過env.getArg(0)就可以拿到這些參數。

***

指定與讀取有名參數

既然有無名參數,就有有名參數,請參考圖3:

  • 指定有名參數:參考圖3的61行可用 ${tax_included=20,000},或是用第64${vat_rate:5%}來指定參數的名稱(可用=或:)。
  • 讀取有名參數:參考圖3第62、65、70、73,讀取方式和圖2類似,但此時使用字串的key來讀取參數內容。

 

▲圖3:ezSpec指定與讀取有名參數的Scenario範例

***

讀取其他Step的參數

有時候你想要在Lambda中讀取其他Step所定義的有名參數,這時候就要用getHistoricalArg函數來取得,請參考圖4第74行:env.getHistoricalArg("tax_included") 讀到第61行所定義的tax_included參數。

 

▲圖4:ezSpec讀取其他Step的有名參數範例

***

在不同的Step中傳遞資料

在撰寫Scenario的時候經常需要在不同的Step之間傳遞資料,例如在67行的When當中你用hasBought變數代表成功購買到電腦,你想在Then的Lambda中驗證hasBought的內容。請參考圖5,此時可以使用ScenarioEnvironment的put(key, value)將要傳遞的資料放到ScenarioEnvironment(第69行),然後在另一個Lambda中用get(key, Class<T>)將資料讀出(第73行)。

 

▲圖5:ezSpec在不同的Step中傳遞資料

***

結語

今天介紹ezSpec撰寫Scenario與指定和讀取參數的方式,Scenario也可以接受一個Table的資料當作參數,Teddy將在下一集介紹這個功能。

***

友藏內心獨白:用Lambda撰寫Step Definition就不用處理煩人的正規表示式了。

沒有留言:

張貼留言