[BDD][Tool][SpecFlow]Scenario 上使用 table 來呈現集合

  • 8947
  • 0

[Tool][SpecFlow]Scenario 上使用 table 來呈現集合

前言

前面這一篇文章:[30天快速上手TDD][Day 24]BDD - SpecFlow Introduction 已經有帶到 SpecFlow 安裝與基本的概念,這一篇文章則是要介紹 SpecFlow 在 scenario 中如何使用 table 的形式來呈現集合。以及在 Steps 中,如何使用 table 的 type 來取得 scenario 上描述的資料。

 

原本的 Scenario 寫法

首先,假設需求是要驗證 IEnumerable<T> 的 Sum 方法, Scenario 可能會寫成這樣:

image

而 Steps 則會類似這樣:

image

這樣顯得有點愚蠢,因為通常針對集合類會依據實務需求而增加不同的 case ,但一旦增加, Steps 對應的 signature 就得跟著異動,而且也不容易呈現集合的意義。

 

Scenario with Table

改成使用 table 的作法,則會類似下圖所示的方式來呈現:

image

可以看到這樣的方式可以很容易地從 scenario 上了解,針對的是一個集合。

對應到 Steps ,則 input 參數會是一個 Table 的 type,如下圖所示:

image

簡單的說, scenario 上使用 table 的方式來描述,可以有多欄多列的方式來呈現一個集合。第一列為 column name ,第二列開始則為 table 的 rows ,使用方式就跟一般的 DataTable 類似,可以透過 row index 與 column index / column name 來取得 table 的值。

 

使用 Table 的擴充方法直接取得強型別物件或集合

如果 Scneario 上描述的 table 需要對應成某個強型別的物件,在 SpecFlow 中已經有針對 table 撰寫好用的 extension method 可以使用,來看下面這個例子:

image

這代表一個 Person 物件,其 Name 為 "Joey", Age 為 10。

當需要在 Steps 中取得 scenario 上這個 person 物件,只需要透過 table 的 CreateInstance<T> 這個 extension method 即可。如下圖所示:

image

image

 

要取得集合也很簡單, scenario 如下圖所示:

image

這次要 Sum 的對象是 List<Person> 裡面的每一個 Age 的值, Scenario 這樣描述是否清楚多了呢?

在 Steps 裡面要取得 IEnumerable<Person> 更是簡單,只需要透過 table 的 CreateSet<T> ,就可以從 scenario 上取得對應的 IEnumerable<T> 集合,如下圖所示:
image

image

CreateSet<T> 與 CreateInstance<T> 需要 using TechTalk.SpecFlow.Assist 這個 namespace 。

 

結論

SpecFlow 不只是讓我們能從 BDD 的角度來撰寫測試案例、需求、設計規格,也提供了不少方便 developer 撰寫測試程式的方法,讓我們能更方便地取得 scenario 上的描述資料,用更清楚的方式來呈現「系統或物件的行為」。


blog 與課程更新內容,請前往新站位置:http://tdd.best/