步驟定義是一個帶有表達式的Java方法,該表達式將其鏈接到一個或多個小黃瓜步驟。當Cucumber在場景中執行小黃瓜步驟時,它將尋找一個匹配的步驟定義來執行。
爲了說明這是如何工作的,請看下面的小黃瓜場景:
Scenario: Some cukes
Given I have 48 cukes in my belly
作爲step一部分的 I have 48 cukes in my belly
( Given
關鍵字後面的文本)將匹配以下步驟定義:
package foo;
import cucumber.api.java.en.Given;
public class MyStepdefs {
@Given("I have {int} cukes in my belly")
public void i_have_n_cukes_in_my_belly(int cukes) {
System.out.format("Cukes: %n\n", cukes);
}
}
或者,使用Java8 lambdas:
package foo;
import cucumber.api.java8.En;
public class MyStepdefs implements En {
public MyStepdefs() {
Given("I have {int} cukes in my belly", (Integer cukes) -> {
System.out.format("Cukes: %n\n", cukes);
});
}
}
表達式
步驟定義的表達式可以是正則表達式,也可以是Cucumber表達式。如果使用正則表達式,則將匹配中的每個捕獲組作爲參數傳遞給步驟定義的方法。
@Given("I have {int} cukes in my belly")
public void i_have_n_cukes_in_my_belly(int cukes) {
}
如果捕獲組表達式與已註冊參數類型的regexp相同,則捕獲的字符串將在傳遞給步驟定義的方法之前進行轉換。在上面的示例中,cukes
參數將是一個整數,因爲內置int
參數類型的regexp是\d+
。
狀態管理
通過在實例變量中存儲狀態,步驟定義可以將狀態傳遞給後續步驟定義。
範圍
步驟定義不鏈接到特定的功能文件或場景。文件、類或包名不影響步驟定義將匹配到什麼小黃瓜步驟。唯一會影響的是步驟定義的表達式。
代碼片段
當Cucumber遇到沒有匹配步驟定義的小黃瓜步驟時,它將打印一個帶有匹配Cucumber表達式的步驟定義片段。您可以將此作爲新步驟定義參考。
考慮一下這個小黃瓜步驟:
Given I have 3 red balls
如果你沒有一個匹配的步驟定義,Cucumber會給出如下代碼片段作爲參考:
@Given("I have {int} red balls")
public void i_have_red_balls(int int1) {
}
如果建議的代碼段與未定義步驟的部分匹配,則它們將使用您自己的參數類型。如果存在Color
參數類型,Cucumber會在建議的表達式中使用:
@Given("I have {int} {color} balls")
public void i_have_red_balls(int int1, Color color) {
}