這一週在嘗試 Cucumber-JVM,這裡稍微簡介一下 Cucumber-JVM 是什麼?Cucumber-JVM 延伸自 Cucumber 這套 Ruby 平台下的 BDD/ATDD 工具,使得 Cucumber 所實現的 BDD 想法和功能,也可以在 Java 平台上實現。

而在 .Net 平台上,也有一套實作 Cucumber 功能的 BDD/ATDD 的工具,叫做 SpecFlow,有興趣的朋友也可以研究看看。其中我認為 91 哥的︰[30天快速上手TDD][Day 24]BDD - SpecFlow Introduction 算是個很好的起點,非常推薦大家閱讀。

本篇算是我設定 Cucumber-JVM 的一些筆記,所以不會有關於 BDD 觀念上的說明。想更了解 BDD/ATDD 的原理的,可以參考 Reference 下 Teddy 大大撰寫的相關文章,和 91 哥的 「30 天快速上手 TDD 」系列,都是相當不錯的參考資料。

要使用 Cucumber-JVM,在 Eclipse 下,需要新增 Java Project,並加入以下 jar 檔的參考︰

  • cucumber-core-1.1.5.jar
  • cucumber-html-0.2.3.jar
  • cucumber-java-1.1.5.jar
  • cucumber-junit-1.1.5.jar
  • cucumber-jvm-deps-1.0.3.jar
  • gherkin-2.12.1.jar
  • gherkin-jvm-deps-1.0.2.jar
  • hamcrest-all-1.3.jar
  • junit-4.11.jar

接著就是撰寫功能的 feature 檔,我們假設有一個列印訂單的功能需求。讓我們新增功能的 feature 檔,檔名為︰訂單列印.feature,規格內容我們特別使用中文來撰寫,比較符合實務上的常見情境︰

Feature: 訂單列印

Scenario: 列印出購物訂單
    Given 一份購物訂單︰
      | 項目  | 個數 |
      | Milk  | 2  |
      | Cocoa | 1  |
      | Soap  | 5  |
    When 使用者按下「列印」鈕
    Then 畫面會顯示以下結果︰
        """
        1 Cocoa
        2 Milk
        5 Soap  
        """

接著我們撰寫 feature 檔背後,真正的測試程式片段,我們新增一個訂單列印Steps.java檔,撰寫測試程式如下︰

package info.littleiln.test;

import java.util.List;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.When;
import cucumber.api.java.en.Then;;

public class 訂單列印Steps {
    @Given("^一份購物訂單︰$")
    public void 一份購物訂單(List<ShoppingItem> items) {
    }
    
    @When("^使用者按下「列印」鈕$")
    public void 使用者按下列印鈕() {        
    }
    
    @Then("^畫面會顯示以下結果︰$")
    public void 畫面會顯示以下結果(String expectedResult) {        
    }
    
    public static class ShoppingItem {
        private String 項目;
        private Integer 個數;
    }
}

大家從 feature 檔後背後 step 定義的 Java 程式碼,應該就可以看出,以自然語言撰寫的 feature 檔,和其背後程式碼的對應關係,是透過像 @Given@When@Then 這些 annotation 來做連結,而即使我在 feature 檔中撰寫的是中文,在對應上也完全沒有問題。唯一要請大家注意的是,feature 檔,和 java 的程式碼檔案,要以 UTF-8 做為編碼格式就可以了。

最後我們要設定 feature 檔的執行起點,我們新增一個 TestRunner.java 檔,程式碼如下︰

package info.littlelin.test;

import org.junit.runner.RunWith;
import cucumber.api.junit.Cucumber;
 
@RunWith(Cucumber.class)
public class TestRunner {
}

TestRunner 會是我們執行 Cucumber-JVM 程式的起點,在新增後,我們的 Eclipse 專案下的檔案結構如下︰

Eclipse 專案結構

我們在 TestRunner.java 檔案上按下滑鼠右鍵,在 Run As 選單上選擇以 JUnit Test 的方式執行這個檔案︰

執行 Cucumber-JVM feature 檔方式

執行結果如下圖︰

Cucumber-JVM 執行結果

大家可以看到,執行的結果項目,展開來就是我們所定義的 Feature、Scenario 和 Step,而且全部是中文顯示喔,是否有點感動?

以上是 Cucumber-JVM 簡單的設定筆記,算是在這一週小撞牆後,總算拼裝出可以跑的環境的備忘。未來有機會再深入研究 Cucumber-JVM 後,會再整理一些相關的心得筆記出來,謝謝。

References

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