Cucumber 可用於根據 Gherkin 功能文件中描述的案例來實作自動化測試。

步驟參數

步驟定義中給出的範例中,Cucumber 從步驟中提取文字 48,將其轉換為 int,並將其作為參數傳遞給

中的參數數量必須與表達式中 的數量相符。(如果存在不匹配,Cucumber 將會拋出錯誤)。

資料表

可以透過在步驟定義中使用 DataTable 物件作為最後一個參數來存取 Gherkin 中的資料表。此轉換可以由 Cucumber 或手動完成。

List<List<String>> table
List<Map<String, String>> table
Map<String, String> table
Map<String, List<String>> table
Map<String, Map<String, String>> table

傳遞給步驟定義最簡單的方法是使用資料表

Given the following animals:
  | cow   |
  | horse |
  | sheep |

將參數宣告為 ,但不要在表達式中定義任何

在這種情況下,DataTable 會在 Cucumber 呼叫步驟定義之前,自動由 Cucumber (使用 DataTable.asList(String.class)) 扁平化為

步驟

步驟類似於方法呼叫或函式調用。

例如

Given I have 93 cucumbers in my belly

在此步驟中,您正在「呼叫」具有一個參數的上述步驟定義:值 93

步驟在您的 檔案中宣告。

比對步驟

  1. Cucumber 會將步驟與步驟定義的 Regexp 進行比對
  2. Cucumber 會收集任何 或變數
  3. Cucumber 會將它們傳遞給步驟定義的 並執行它

回想一下,步驟定義以介系詞副詞 (GivenWhenThenAndBut) 開頭。

所有步驟定義都會在 Cucumber 開始執行功能檔案中的純文字之前載入(和定義)。

一旦執行開始,對於每個步驟,Cucumber 都會尋找具有相符 Regexp 的已註冊步驟定義。如果找到,它將會執行它,並將 Regexp 中的所有 和變數作為參數傳遞給

當 Cucumber 註冊或尋找步驟定義時,所使用的特定介系詞/副詞沒有意義。

此外,請查看多行步驟參數,以取得更多關於如何將整個表格或較大的字串傳遞給步驟定義的資訊。

步驟結果

每個步驟可以有下列其中一個結果

成功

當 Cucumber 找到相符的步驟定義時,它將會執行它。如果步驟定義中的區塊沒有引發錯誤,則該步驟會標示為成功(綠色)。您從步驟定義中 return 的任何內容都無關緊要。

未定義

當 Cucumber 找不到相符的步驟定義時,該步驟會標示為未定義(黃色),並且會跳過情節中的所有後續步驟。

待定

當步驟定義的 呼叫 pending 時,該步驟會被標記為 pending(黃色,如同 undefined 的步驟),表示您還有工作要做。

失敗的步驟

當執行步驟定義的 時,如果發生錯誤,該步驟會被標記為失敗(紅色)。從步驟定義中回傳的任何值都無關緊要。

回傳 false不會導致步驟定義失敗。

已跳過

undefinedpendingfailed 的步驟之後的步驟永遠不會被執行,即使有相符的步驟定義也是如此。這些步驟會被標記為已跳過(青色)。

不明確

步驟定義必須是唯一的,Cucumber 才能知道要執行什麼。如果您使用不明確的步驟定義, 告訴您要修正這個不明確之處。

鉤子 (Hooks)

鉤子是在 Cucumber 執行週期中的不同時間點可以執行的程式碼區塊。它們通常用於在每個情境之前和之後設定和拆解環境。

鉤子的定義位置不會影響它為哪些情境或步驟執行。如果您想要更精細的控制,可以使用條件式鉤子

情境鉤子

情境鉤子會在每個情境執行。

Before

Before 鉤子會在每個情境的第一個步驟之前執行。

使用 Before 之前請三思

Before 鉤子中發生的任何事情對於只讀取 feature 的人是不可見的。您應該考慮使用 background 作為更明確的替代方案,特別是當設定應該可以由非技術人員讀取時。僅將 Before 鉤子用於底層邏輯,例如啟動瀏覽器或從資料庫中刪除資料。

After

After 鉤子會在每個情境的最後一個步驟之後執行,即使步驟結果為 failedundefinedpendingskipped 也是如此。

scenario 參數是選用的。如果您使用它,您可以檢查情境的狀態。

例如,您可以使用 為失敗的情境拍攝螢幕截圖,並將它們嵌入 Cucumber 的報告中。

請參閱瀏覽器自動化頁面,以取得如何執行此操作的範例。

Around

步驟鉤子

BeforeStep

AfterStep

條件式鉤子

可以根據情境的標籤有條件地選擇執行鉤子。若要僅針對某些情境執行特定的鉤子,您可以將 鉤子與標籤運算式建立關聯。

請參閱關於標籤的更多文件。

全域鉤子

全域鉤子會在任何情境執行之前執行一次,或在所有情境都執行完畢之後執行一次。

BeforeAll

BeforeAll 會在執行任何情境之前執行。

AfterAll

AfterAll 會在執行完畢所有情境之後執行。

InstallPlugin

AfterConfiguration

AfterConfiguration 已被棄用,改用 BeforeAllInstallPlugin,具體取決於您的需求。

標籤

標籤是組織您的 feature 和情境的好方法。

它們可用於兩個目的

請考慮以下範例

@billing
Feature: Verify billing

  @important
  Scenario: Missing product description
    Given hello

  Scenario: Several products
    Given hello

一個 feature 或情境可以擁有任意多個標籤。用空格分隔它們

@billing @bicker @annoy
Feature: Verify billing

標籤可以放在以下 Gherkin 元素上方

  • Feature
  • 情境
  • 情境大綱
  • 範例

Scenario Outline 中,您可以在不同的範例中使用標籤,如下所示

Scenario Outline: Steps will run conditionally if tagged
  Given user is logged in
  When user clicks <link>
  Then user will be logged out

  @mobile
  Examples:
    | link                  |
    | logout link on mobile |

  @desktop
  Examples:
    | link                   |
    | logout link on desktop |

不可能將標籤放在 Background 或步驟(GivenWhenThenAndBut)上方。

標籤繼承

標籤由子元素繼承。

位於 Feature 上方的標籤將會被 ScenarioScenario OutlineExamples 繼承。

位於 Scenario Outline 上方的標籤將會被 Examples 繼承。

執行情境的子集

您可以告訴 Cucumber 只執行具有特定標籤的情境

忽略情境的子集

您可以告訴 Cucumber 忽略具有特定標籤的情境

依行篩選

執行情境子集的另一種方式是使用 file.feature:line 模式或 --scenario 選項。

標籤表達式

標籤表達式是一種中綴布林表達式。以下是一些範例

表達式 描述
@fast 標記為 @fast 的情境
@wip and not @slow 標記為 @wip 且未同時標記為 @slow 的情境
@smoke and @fast 同時標記為 @smoke@fast 的情境
@gui or @database 標記為 @gui@database 的情境

對於更進階的標籤表達式,您可以使用括號來提高清晰度,或變更運算符優先順序

(@smoke or @ui) and (not @slow)

使用標籤進行文件編寫

在將標籤用於文件編寫時,唯一限制您的是您的想像力。

標籤可以參考外部系統中的 ID,例如需求管理工具、問題追蹤器或測試管理工具

@BJ-x98.77 @BJ-z12.33
Feature: Convert transaction

您可以使用自訂 Cucumber 報告外掛程式,將標籤轉換為指向外部工具中文件的連結。

開發流程

使用標籤的另一種創新方式是追蹤特定功能在開發流程中的位置

@qa_ready
Feature: Index projects

執行 Cucumber

可以設定 Cucumber 應如何執行功能。

從命令列

您也可以使用建置工具IDE來執行功能。

JUnit 5

JUnit 4

選項

Cucumber 提供了數個可以在命令列上傳遞的選項。

列出設定選項

您可以列出您正在使用的 Cucumber 版本可用的選項。

您也可以使用標籤來指定要執行的內容。

您可以幫助我們改進此文件。編輯此頁面