March 15 08:57~11:00;20:02~08:19
▲用ezSpec寫ezSpec的使用說明文件
前言
上一集<使用ezSpec落實行為驅動開發與實例化需求(1):領域模型介紹>提到Feature是Gherkin用來描述需求的最大單位,今天介紹在ezSpec中如何撰寫Feature。
在介紹撰寫Feature之前,先說明External DSL(外部領域特定語言)與Internal DSL(內部領域特定語言)這兩個名詞。使用Cucumber、SpecFlow或Cucumber-JVM這類工具的鄉民,將Feature寫在feature file裡面,再交由工具產生Step Definition,然後撰寫Step Definition以達到驗收測試自動化的目的。Gherkin是一種用來描述需求或規格的DSL(Domain-Specific Language,領域特定語言),Cucumber系列工具的作法Teddy將其稱為External DSL,因為用來描述需求的語言(也就是Gherkin),和開發用的程式語言(Ruby、C#或Java)並不相同,因此Gherkin成為「外部領域特定語言」。
External DSL的好處與缺點Teddy在<無痛將驗收測試文件寫在測試案例中>與<使用ezSpec落實行為驅動開發與實例化需求(1):領域模型介紹>提過,有興趣的鄉民可參考。ezSpec是一種Internal DSL,使用Java語言模擬Gherkin,換句話說用來描述需求或規格的DSL與開發者使用的程式語言是一致的。
***
撰寫第一個Feature
ezSpec除了採用Internal DSL的方式開發,它也與JUnit 5結合,撰寫Feature檔就和傳統寫一個Test Class是一樣的方式。請參考圖1第8行,FeatureSpec是一個一般的Java Class,名稱可以隨便取,你也可以把它叫做FeatureTest或任何你喜歡的名字。
FeatureSpec實作ezSpec interface,這麼做可以讓ezSpec自動產生報表。如果你只需要在IDE裡面觀看JUnit所產生的報表,也可以不用實作這個介面。
在第9行宣告一個static Feature feature 物件,用來代表一個feature file。請注意,如果你要讓ezSpec自動產生報表,這個static Feature的變數名稱一定要取名為 feature,否則系統無法自動產生報表。接著第11~21行使用JUnit 5標準的@BeforeAll annotation來定義feature的內容。第13行的Feature.New()產生一個新的Feature物件,它接受兩個參數:
- Name:Feature的名稱,用來代表一個交付給使用者的功能或功能組。
- Description:Feature的詳細內容描述,除了進一步說明Feature的內容,也可以拿來定義這個Feature會用到的詞彙,這些詞彙可以成為通用語言(ubiquitous language)的一部分。
▲圖1:ezSpec 的Feature使用範例
定義好feature之後,可以直接寫一個test method來執行看看,驗證feature的內容,請參考第24~40行,這個test method單純驗證feature的內容是否正確,其產生的報表如圖2。
▲圖2:ezSpec產生的Feature報表範例
***
Story
ezSpec 的Feature物件本身只是一個「容器」,實際上的需求內容是寫在Scenario裡面。在Feature與Scenario之間,ezSpec還支援Story。一個Feature需要包含至少一個Story,Scenario則是附屬於某一個Story。
請參考圖3,第16行呼叫feature.newStory新增一個Story,它和Feature一樣有Name和Description欄位,其用途也類似。此外,Story還有一個Index欄位,可以指定一個編號給它,之後可以使用這個編號來讀取Story。
基本上Story就是一個小Feature,如果你覺得不需要Story來管理更小的功能,在撰寫Feature的時候,只需要幫每一個Feature寫一個Story,然後由該Story來產生所有的Scenario。
▲圖3:ezSpec 的Story使用範例
▲圖4:ezSpec 產生的Story報表 (未包含內部的Scenario、Scenario Outline與Background)
新增Story之後,可以呼叫feature.withStory拿到屬於該feature的story,然後再透過它的newScenario產生Scenario。下一集將介紹如何使用Scenario與Given-Then-Then撰寫需求範例。
***
友藏內心獨白:運動前先暖身。
沒有留言:
張貼留言