Jan. 26 17:26~18:30; 21:11~ 22:38

今天是除夕,預祝鄉民新年快樂,雞年可以少遇到一些「GGYY的人」。
在〈在IntelliJ IDEA使用Cucumber(上)〉已經把IntelliJ IDEA關於使用Cucumber的環境都設定好了,終於可以正式開工。
***
新增Feature與Step Definition
▼在上集中已經產生hello_world.feature,現在沿用之前的範例把內容貼上。這時候發現檔案前面出現一個小燈泡的圖示。
![屏幕截图 2017-01-26 15.31.52_thumb[1] 屏幕截图 2017-01-26 15.31.52_thumb[1]](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqlBW-EsytABnW27FnLF_OP5j6lD3IAAZQxXCvqdryBBVyc9xaqYt9iUD3k8R8gpZY1vpo3i6EziSl1_5Cdv9HMLiaOPlgUO65ttKPOe8c5tZlF0sTOgqqCqzLRO4rrdNWQg8RU2JfFjMq/*%2525C3%2525BE%2525202017-01-26%25252015.31.52_thumb%25255B1%25255D_thumb.png?imgmax=800)
▼點選小燈泡圖示之後出現「Create step definition」與「Create all steps definition」這兩個選項。當然選取「Create all steps definition」產生全部的步驟定義。
![屏幕截图 2017-01-26 15.33.07_thumb[1] 屏幕截图 2017-01-26 15.33.07_thumb[1]](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtLcFnHRrjdkoytFg-F_hPOQLzaNORfYWMwAS6bvx58sKNTasjGEhzowtpr3kZA3ieBufj_UzgvzgGxOuM2PwzBoqJPGnRBYbKZlDZz4ZJezASsbDeC_tqVizvQf8qIxm1fYsPtXfQ-AiX/*%2525C3%2525BE%2525202017-01-26%25252015.33.07_thumb%25255B1%25255D_thumb.png?imgmax=800)
▼把步驟定義檔取名為HelloStepdefs,檔案位置先用預設值隨便放沒關係,等一下再整理、移動。記得把File type:選擇「Java」(預設是Java 8),如果用預設值會有一個小問題稍後再說明。

▼在test目錄新增一個steps package準備把剛剛產生的HelloStepdefs拉過去。


▼IntelliJ IDEA會自動幫我們修改HelloStepdefs的package name。

▼打開HelloStepdefs檔案,耶,奇怪,剛剛不是選擇「Create all steps definition」請IntelliJ IDEA幫我們產生全部的step定義,應該要有三個step定義怎麼會只有一個?

▼這時候切換回hello_world.feature,在「When I ask it to say hi」這一行按下滑鼠右鍵,選Go To—>Declaration或【command】+【B】。

▼會直接跳到HelloStepdefs檔案的第11行,表示hello_world.feature的「When I ask it to say hi」已經透過HelloStepdefs的@When("^I ask it to say hi$") 建立連結。

▼但是問題還是沒解決,少了2個step定義沒有自動產生。現在打開hello_world.feature,在還沒產生step定義的「Given I have a greeting application with "Hello"」或「Then I receive "Hello World"」按【option (Alt)】+【enter】,選擇「Create all steps definition」再產生一次。

▼這時候IntelliJ IDEA會詢問要產生新的檔案還是重用之前的檔案,當然選擇產生在HelloStepdefs(steps)。

▼這時候3個step定義都已經出現在HelloStepdefs。很顯然這是一個Cucumber外掛的bug,要跑兩次才可以產生全部的step定義。

***
執行測試:方法一
▼現在空的驗收測試案例已經完成,依據BDD/TDD開發流程第一步就是產生一個失敗的測試案例。這個測試案例要怎麼跑?在hello_world.feature檔案按下滑鼠右鍵,選擇Run ‘Feature:hello_world’。

▼奇怪,怎麼執行之後出現:
Undefined step: Given I have a greeting application with "Hello"
Undefined step: When I ask it to say hi
Undefined step: Then I receive "Hello World"
1 Scenarios (1 undefined)
3 Steps (3 undefined)
0m0.000s

顯然是找不到對應的step定義檔,怎麼會這樣?原來是還有一個地方需要設定,告訴執行測試案例的程式(test runner)要去那裡尋找step定義檔。
▼點選右上方那個小的倒三角形,然後選擇「Edit Configurations…」。

▼在Clue 設定輸入steps。

▼再執行一次hello_world.feature,這時候錯誤訊息不同,有找到step定義檔只不過這些step定義檔還沒有實作。

▼請注意畫面左方列出了Given…When..Then三個步驟,如果直接用滑鼠雙擊某個步驟,會自動跳到hello_world.feature檔案中相對應的原始定義。

***
執行測試:方法二
▼直接在IntelliJ IDEA設定Glue屬性把feature檔案與step definition連結起來固然方便,但如果要在IntelliJ IDEA以外的環境執行驗收測試就沒辦法這麼做。這時候可以透過JUnit 4的客製化test runner功能來讓Cucumber執行驗收測試。首先新增一個GreetingTest Java檔案。

▼在裡面輸入一下內容,注意以下參數要設定Cucumber的test runner才找到的feature與step definition的對應。
@CucumberOptions(
features = "src/test/Features/hello_world.feature",
glue = {"steps"})

▼執行結果如下所示,點選右邊的步驟並無法像剛剛方法一可以直接跳到定義該步驟的feature檔案,這是用JUnit 4去跑Cucumber在IntelliJ IDEA上的小缺點。

***
實作Step定義
▼到目前為止HelloStepdefs還沒有實作,實作方式直接參考〈BDD(5):第一個Cucumber-JVM範例,下集〉。

▼跑驗收測試案例,現在通過了。

▼透過JUnit 4跑驗收測試,結果一樣通過。

***
結論
這個例子算是Cucumber的「Hello World」等級的小程式,非常簡單,主要目的在於介紹如何在IntelliJ IDEA的環境中使用Cucumber。把工具與環境設定的問題先解決,接下來要練習書本或網路上的各種範例就簡單很多。
***
友藏內心獨白:Java工具對於Cucumber的支援還是有很大的進步空間啊。
延伸閱讀
- BDD(1):詳盡的文件就是可用的軟體
- BDD(2):大家來吃小黃瓜之Cucumber運作原理
- BDD(3):在Eclipse執行Cucumber-JVM
- BDD(4):第一個Cucumber-JVM範例,上集
- BDD(5):第一個Cucumber-JVM範例,下集
- Cucumber options annotation