l

2017年1月27日 星期五

在IntelliJ IDEA使用Cucumber(下)

Jan. 26 17:26~18:30; 21:11~ 22:38
屏幕截图 2017-01-26 22.38.04

 

今天是除夕,預祝鄉民新年快樂,雞年可以少遇到一些「GGYY的人」。

在〈在IntelliJ IDEA使用Cucumber(上)〉已經把IntelliJ IDEA關於使用Cucumber的環境都設定好了,終於可以正式開工。

***

新增Feature與Step Definition

▼在上集中已經產生hello_world.feature,現在沿用之前的範例把內容貼上。這時候發現檔案前面出現一個小燈泡的圖示。

屏幕截图 2017-01-26 15.31.52_thumb[1]

 

▼點選小燈泡圖示之後出現「Create step definition」與「Create all steps definition」這兩個選項。當然選取「Create all steps definition」產生全部的步驟定義。

屏幕截图 2017-01-26 15.33.07_thumb[1]

 

▼把步驟定義檔取名為HelloStepdefs,檔案位置先用預設值隨便放沒關係,等一下再整理、移動。記得把File type:選擇「Java」(預設是Java 8)如果用預設值會有一個小問題稍後再說明

屏幕截图 2017-01-26 17.45.12

 

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

屏幕截图 2017-01-26 21.24.21

屏幕截图 2017-01-26 17.36.27

 

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

屏幕截图 2017-01-26 21.26.13

 

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

屏幕截图 2017-01-26 21.27.48

 

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

屏幕截图 2017-01-26 21.29.56

 

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

屏幕截图 2017-01-26 21.38.15

 

▼但是問題還是沒解決,少了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」再產生一次。

屏幕截图 2017-01-26 21.42.06

 

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

屏幕截图 2017-01-26 21.44.55

 

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

屏幕截图 2017-01-26 21.47.30

***

執行測試:方法一

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

屏幕截图 2017-01-26 21.49.33

 

▼奇怪,怎麼執行之後出現:

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

屏幕截图 2017-01-26 21.54.39

顯然是找不到對應的step定義檔,怎麼會這樣?原來是還有一個地方需要設定,告訴執行測試案例的程式(test runner)要去那裡尋找step定義檔。

 

▼點選右上方那個小的倒三角形,然後選擇「Edit Configurations…」。

屏幕截图 2017-01-26 21.57.07

 

▼在Clue 設定輸入steps

屏幕截图 2017-01-26 21.59.03

 

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

屏幕截图 2017-01-26 22.01.06

 

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

屏幕截图 2017-01-26 22.04.28

***

執行測試:方法二

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

屏幕截图 2017-01-26 22.11.28

 

▼在裡面輸入一下內容,注意以下參數要設定Cucumber的test runner才找到的feature與step definition的對應。

@CucumberOptions(
        features = "src/test/Features/hello_world.feature",
        glue = {"steps"})

屏幕截图 2017-01-26 22.16.00

 

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

屏幕截图 2017-01-26 22.18.19

***

實作Step定義

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

屏幕截图 2017-01-26 22.27.42

 

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

屏幕截图 2017-01-26 22.28.21

 

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

屏幕截图 2017-01-26 22.29.36

***

結論

這個例子算是Cucumber的「Hello World」等級的小程式,非常簡單,主要目的在於介紹如何在IntelliJ IDEA的環境中使用Cucumber。把工具與環境設定的問題先解決,接下來要練習書本或網路上的各種範例就簡單很多。

***

友藏內心獨白:Java工具對於Cucumber的支援還是有很大的進步空間啊。

延伸閱讀

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

沒有留言:

張貼留言