入門與協助
如何開始使用 Cucumber?
若要從頭開始,請試用10 分鐘教學。
如果您偏好從可運作的專案開始(或者如果您在使教學運作時遇到問題),您可以使用cucumber-java-skeleton開始。此專案旨在「開箱即用」。
您可以閱讀這些文件以深入瞭解Gherkin、Cucumber 和BDD。還有幾個關於 Cucumber 和 BDD 的部落格文章連結。
在哪裡可以取得更深入的資訊?
如果您想更深入瞭解,請嘗試下列其中一種
在哪裡可以獲得協助?
如有問題,您可以與社群取得聯繫。
安裝與執行 Cucumber
如何安裝 Cucumber?
如何安裝 Cucumber 取決於您使用的程式設計語言。
您可以在安裝頁面上找到如何安裝您的 Cucumber 版本資訊。
我應該使用哪個版本的 Cucumber?
一般而言,建議為您的程式設計語言使用最近發布的 Cucumber 版本。每個版本都會修正已知的錯誤和/或新增功能。
您可以在10 分鐘教學、安裝頁面或GitHub中找到最近版本的 Cucumber。
請注意,在 Cucumber-JVM v2.x 中,groupId
已從 info.cukes
變更為 io.cucumber
。如果您找不到比 1.2.5 更新的版本,請變更您的相依性中的 groupId。
升級
Cucumber 嘗試遵循SemVer規格進行版本號碼設定。基本上,這表示
- 如果只有版本中右手邊的(修補程式)號碼變更,則您無需擔心。
- 如果版本中的中間(次要)號碼變更,則您無需擔心。
- 如果左手邊的(主要)號碼變更,您可以預期可能會發生問題。
您可以閱讀變更日誌檔案,以瞭解每個版本中的變更。
您可以閱讀變更日誌檔案,以瞭解每個版本中的變更。
您可以閱讀變更日誌檔案,以瞭解每個版本中的變更。
您可以閱讀變更日誌檔案,以瞭解每個版本中的變更。
如何執行 Cucumber?
如需如何執行 Cucumber 的資訊,請參閱執行 Cucumber。
如何從 CLI 執行 Cucumber?
如需如何執行 Cucumber CLI 的資訊,請參閱從命令列。
執行 Cucumber 的組態選項有哪些?
如需組態選項的資訊,請參閱組態。
使用 JUnit 5 時,請參閱cucumber-junit-platform-engine 文件。
使用 JUnit 4 執行 Cucumber 時,您可以指定 JUnit 4 應如何執行您的測試的數個選項。請查看JUnit上的章節以取得更多資訊。如需有關可用 CucumberOptions 的更多詳細資訊,請查看程式碼。
使用 JUnit 5 時,請參閱cucumber-junit-platform-engine 文件。
使用 JUnit 4 執行 Cucumber 時,您可以指定 JUnit 4 應如何執行您的測試的數個選項。請查看JUnit上的章節以取得更多資訊。如需有關可用 CucumberOptions 的更多詳細資訊,請查看程式碼。
Cucumber 說我的步驟未定義,但我已實作步驟定義!
如果 Cucumber 告訴您您的步驟未定義,而您已定義步驟定義,這表示 Cucumber 無法找到您的步驟定義。您需要確保正確指定您的步驟定義(膠合路徑)的路徑。
預設情況下,Cucumber-JVM 會在執行程式類別的套件(或子套件)中搜尋。您也可以明確告訴 Cucumber-JVM 要搜尋哪些套件(和子套件),方法是
@CucumberOptions(glue = {"<package>", "<package>", "<etc>"})
public class RunCucumberTest{}
@CucumberOptions(glue = ["<package>", "<package>", "<etc>"])
class RunCucumberTest
預設情況下,Cucumber-JVM 會在執行程式類別的套件(或子套件)中搜尋。您也可以明確告訴 Cucumber-JVM 要搜尋哪些套件(和子套件),方法是
@CucumberOptions(glue = {"<package>", "<package>", "<etc>"})
public class RunCucumberTest{}
@CucumberOptions(glue = ["<package>", "<package>", "<etc>"])
class RunCucumberTest
Cucumber 運算式與 regex
如需有關 Cucumber 運算式的更多資訊,請參閱Cucumber 運算式上的章節。您仍然可以使用正規表示式(regex),但是您不能在同一個步驟定義中使用 Cucumber 運算式和正規表示式。
Cucumber 運算式是在 Cucumber-JVM 3.0.0 版中新增的。
請注意,使用 regex 的步驟定義會以 ^
開頭,並以 $
結尾,而使用 Cucumber 運算式的步驟定義則不會。
使用 regex 的範例
@Given("^today is ([0-9]{4}-[0-9]{2}-[0-9]{2})$")
public void today_is(Date date) {
calculator = new DateCalculator(date);
}
使用 Cucumber 運算式的範例
@When("I add {int} and {int}")
public void adding(int arg1, int arg2) {
calc.push(arg1);
calc.push(arg2);
calc.push("+");
}
Cucumber 運算式是在 Cucumber-JVM 3.0.0 版中新增的。
請注意,使用 regex 的步驟定義會以 ^
開頭,並以 $
結尾,而使用 Cucumber 運算式的步驟定義則不會。
使用 regex 的範例
@Given("^today is ([0-9]{4}-[0-9]{2}-[0-9]{2})$")
public void today_is(Date date) {
calculator = new DateCalculator(date);
}
使用 Cucumber 運算式的範例
@When("I add {int} and {int}")
public void adding(int arg1, int arg2) {
calc.push(arg1);
calc.push(arg2);
calc.push("+");
}
如何使用 lambda 定義步驟定義?
Lambda 是 Java 和 Kotlin 特有的。
Lambda 是 Java 和 Kotlin 特有的。
若要使用 lambda 定義您的步驟定義,請務必使用 cucumber-java8
相依性,而不是 cucumber-java
相依性。您可以在這裡找到所需的相依性。
若要使用 lambda 定義您的步驟定義,請務必使用 cucumber-java8
相依性,而不是 cucumber-java
相依性。您可以在這裡找到所需的相依性。
如需如何使用它們的範例,請參閱此程式碼範例。
如需如何使用它們的範例,請參閱此程式碼範例。
如何呼叫其他步驟或情節?
每個情節都應該是獨立的;您應該能夠以任何順序或平行執行它們,而不會有一個情節干擾另一個情節。
每個情節都應該只測試一件事情,以便在失敗時,其失敗的原因會很清楚。這表示您不會在另一個情節內重複使用一個情節。
如果您的情境使用相同或相似的步驟,或在您的系統上執行相似的動作,您可以提取輔助方法來執行這些操作。
如何使用輔助方法
輔助方法允許您在步驟中重複使用動作,並避免為相似的行為撰寫多個步驟定義。您可以為諸如登入您的應用程式之類的動作撰寫輔助方法,然後將它們重複用作步驟或其他步驟的一部分。這有助於保持您的測試乾淨、簡潔且易於維護。
要了解更多關於使用輔助方法的資訊,請查看輔助方法和步驟定義分組。
情境應該有多詳細?
您的情境應該包含足夠的資訊來描述系統的行為。它們不應描述您應用程式的實作方式,因為實作方式可能會變更,導致您的測試失敗。它們不應包含太多細節,因為這會分散對實際行為的注意力。
讓我們用一個例子來說明。假設我們有一個流程,使用者會收到結果的通知。目前,這可能是透過發送電子郵件來實現的,但未來可能會改變(例如,改為簡訊)。您可以按如下方式指定步驟
Then the user will be notified
這樣,如果通知使用者的方式的實作方式發生變化,您只需要更改步驟定義(或該步驟定義呼叫的輔助方法),而不是步驟本身以及所有底層程式碼。
如需更多資訊,請查看撰寫更好的 Gherkin 和/或 撰寫可維護的自動化驗收測試(pdf)。
如何在 Excel / csv 中指定我的測試案例?
我們建議您不要使用 Excel 或 csv 檔案來定義您的測試案例;使用 Excel 或 csv 檔案被認為是一種反模式。
Cucumber 的目標之一是擁有可執行的規格。這表示您的 feature 檔案應該包含適當程度的資訊來記錄系統的預期行為。如果您的測試案例保存在單獨的檔案中,您將如何閱讀文件?
這也表示您的 feature 檔案不應該有太多細節。如果有,您可以考慮將它們移到您的步驟定義或輔助方法。例如,如果您有一個表單需要填寫許多不同的欄位,您可以使用建構者模式來執行此操作。
如何讓 Cucumber 有條件地跳過步驟
每個情境都應該測試一件事,並且因一個特定的原因而失敗。這表示沒有理由跳過步驟。
如果看起來確實有理由讓您想有條件地跳過步驟,您可能正在使用一種反模式。例如,您可能正在嘗試在一個情境中測試多件事情,或者您可能無法控制測試環境或測試資料的狀態。
這裡最好的方法是找出根本原因並加以解決。
如何在步驟失敗後讓 Cucumber 執行跳過的步驟
Cucumber 會按設計跳過失敗步驟之後的所有步驟。一旦某個步驟失敗,測試就會失敗,沒有理由執行後續步驟。如果您需要執行額外步驟,很可能是您的情境一次測試太多不同的事情。請考慮將您的情境分成較小的測試。
在(失敗)步驟之後截圖
當情境失敗時截圖可能會幫助您找出問題所在。若要在失敗時截圖,您可以設定一個after hook。
關於如何使用 WebDriverWebDriverWebDriverCapybara 截圖並將它們嵌入 Cucumber 報告中的範例,請參閱瀏覽器自動化頁面。
以下是如何使用WebDriver截圖,並將它們嵌入 Cucumber 報告中的範例。
以下是如何使用WebDriver截圖,並將它們嵌入 Cucumber 報告中的範例。
以下是如何使用WebDriver截圖,並將它們嵌入 Cucumber 報告中的範例。
請注意,在每個步驟之後截圖都被視為反模式。您應該能夠依靠您的測試自動化,而無需使用螢幕截圖來檢查情境的每個步驟。您的自動化應該是穩定的,並且測試應該因明確的原因而失敗。
在主控台輸出中取得奇怪的字元
如果您在步驟的輸出中收到一些奇怪的額外字元,例如 [32m
,這是轉義 ANSI 顏色代碼的問題。
這是使用 Java 時可能發生的問題。
這是使用 Java 時可能發生的問題。
為了防止這個問題,您可以將選項 monochrome
設定為 `true`。
如果您正在使用 Eclipse,您可以嘗試這個外掛程式。
為了防止這個問題,您可以將選項 monochrome
設定為 `true`。
如果您正在使用 Eclipse,您可以嘗試這個外掛程式。
如何在步驟之間共享狀態?
為了在步驟之間共享狀態,您可以使用世界物件。
為了在步驟之間共享狀態,您可以使用世界物件。
如果您在 JVM 上使用 Cucumber,您可以使用依賴注入 (DI) 來在步驟之間共享狀態。
如果您的專案已經使用 Cucumber 支援的依賴框架(和/或您熟悉其中一個框架),那麼使用該框架可能是最容易的。否則,Picocontainer 是您可以使用的最輕量級的框架。
如果您在 JVM 上使用 Cucumber,您可以使用依賴注入 (DI) 來在步驟之間共享狀態。
如果您的專案已經使用 Cucumber 支援的依賴框架(和/或您熟悉其中一個框架),那麼使用該框架可能是最容易的。否則,Picocontainer 是您可以使用的最輕量級的框架。
參數不匹配
參數不匹配例外cucumber.runtime.CucumberException: Arity mismatch
cucumber.runtime.CucumberException: Arity mismatch
表示該步驟未提供步驟定義所需的正確參數數量。
重複的步驟定義
DuplicateStepDefinitionException 表示您已經定義了相同的步驟兩次。首先,當匹配步驟時,Cucumber 不會區分與特定步驟一起使用的關鍵字。這表示 Given an order exists
和 Then an order exists
都會匹配「an order exists」。當使用 Cucumber 運算式和/或正規運算式提供參數時,多個步驟可能會匹配相同的運算式。最後,這表示您不能擴展定義步驟定義的類別,因為這會導致重複。
Cucumber-JVM 是否支援 Kotlin?
您可以使用 Cucumber-JVM 以 Kotlin 撰寫步驟定義。請查看cucumber-jvm 的 Kotlin 範例。目前,無法在 Kotlin 中產生步驟定義。原因是因為沒有實作 Kotlin 後端。如果您想為此做出貢獻,有一個相關請求。還有一個關於 Cucumber 的原生 Kotlin 實作 的請求。
Cucumber 無法在 IntelliJ IDEA 中找到我的步驟定義
在這種情況下,您需要在 IntelliJ IDEA 中設定新的執行配置。1. 從 IntelliJ IDEA 的選單中點擊 Run > Edit Configurations。2. 點擊左上角的 + 圖示,然後輸入 cucumber。選擇 Cucumber Java。3. 根據 JetBrains 的 執行/偵錯配置 Cucumber Java 指示建立配置。
如果 IntelliJ IDEA 無法識別包含步驟定義的套件,您可以在 Glue 欄位中輸入套件名稱(例如 stepdefs)來手動指定。
如需更多資訊,請參閱 JetBrains 文件中的執行 Cucumber 測試。
如何修正 Cucumber-JVM 錯誤,其堆疊追蹤包含 'Failed to instantiate public cucumber.runtime.java.JavaBackend' 或 'NoSuchMethodException'?
檢查所有 Cucumber 依賴項的 Cucumber 版本是否相同,並確保您只有必要的依賴項。這表示您需要確保您取得與您擁有的 Cucumber 版本相關的傳遞依賴項。
您可以執行 mvn dependency:tree
來查看所有 Maven 依賴項,包括傳遞依賴項。
如果您正在使用任何其他也包含 Cucumber 依賴項的程式庫(傳遞依賴項),請嘗試在您的 pom 檔案中排除該傳遞依賴項,以確保只引用一個版本的 Cucumber。請參閱 Maven 的 排除依賴項說明,了解有關排除傳遞依賴項的步驟。