l

2017年2月22日 星期三

BDD(7):使用Transform讓稅金同時支援5%和0.05表達方式

Feb. 21 22:00~00:00

屏幕截图 2017-02-22 00.02.34

▲好亂的程式碼XD

 

問題描述

今天延續昨天的例子,討論Cucumber的Transform功能。在昨天的範例中我們用「0.05」的格式來表達營業稅:

Given The VAT rate is 0.05

相對應的step definition為:

Given("^The VAT rate is (\\d+\\.\\d+)$", (Double arg1) –> {

如果有人想要用%的方式來表示營業稅:

Given The VAT rate is 5%

那麼相對應的相對應的step definition變成:

Given("^The VAT rate is (\\d+)%$", (Integer arg1) –> {

Given("^The VAT rate is (\\d+%)$", (String arg1) –> {

對撰寫scenario的人來說,用0.05或5%來代表營業稅都是一樣的意思,如果需要兩條不同的step definition來表示相同的東西,感覺有點怪怪的。怎麼辦?

***

使用 Or

我們可以使用regular expression的「|」符號來讓一個step definition同時對應「0.05」與「5%」:

▼以下scenario例子故意重複撰寫兩次「The VAT rate is」,第一次使用0.05,第二次使用5%。

屏幕截图 2017-02-21 23.41.10

 

▼這個step definition可以同時對應到以上兩種情況。

Given("^The VAT rate is (\\d+\\.\\d+|\\d+%)$", (String arg1) -> {
    System.out.println("arg1 = " + arg1);
});


▼輸出結果為:

arg1 = 0.05
arg1 = 5%

但是這樣問題只解決了一半,因為我們希望營業稅可以用以下方式指定給Invoice物件:

invoice.setVATRate(arg1);

現在營業稅的資料型態變成String,應該想辦法轉成double或其他資料型態,這樣之後要進行數字運算比較方便。

***

▼Cucumber的Transform功能可以協助解決這個問題,首先我們新增Percentage(百分比)類別,它可以接受0.05或5%這種格式,然後轉成double型態。

屏幕截图 2017-02-21 23.50.00

 

▼接著新增PercentageTransformer類別,它必須繼承自Cucumber的Transformer類別,然後覆寫transform method,以便把一個字串轉成Percentage類別。

屏幕截图 2017-02-21 23.51.29

 

▼到這裡準備工作都已就緒,最後只要把step definition改一下,從原本傳入參數接受String型別改成接受Percentage型別,然後在它前面加上@Transform(PercentageTransformer.class)告訴Cucumber如何把step裡面的字串(也就是0.05或5%)透過PercentageTransformer類別轉成Percentage型別傳入。

屏幕截图 2017-02-21 23.55.52

 

▼輸出結果為:

arg1 data = 0.05
arg1 = 0.05
arg1 data = 5%
arg1 = 0.05

現在我們的scenario可以同時支援「Given The VAT rate is 0.05」與「Given The VAT rate is 5%」了。

***

友藏內心獨白:自動轉換型別還挺方便的。

 

延伸閱讀

  1. BDD(1):詳盡的文件就是可用的軟體
  2. BDD(2):大家來吃小黃瓜之Cucumber運作原理
  3. BDD(3):在Eclipse執行Cucumber-JVM
  4. BDD(4):第一個Cucumber-JVM範例,上集
  5. BDD(5):第一個Cucumber-JVM範例,下集
  6. 在IntelliJ IDEA使用Cucumber(上)
  7. 在IntelliJ IDEA使用Cucumber(下)
  8. BDD(6):讓Step找到Step Definition

沒有留言:

張貼留言