步驟定義是一個(gè)帶有表達(dá)式的Java方法钓觉,該表達(dá)式將其鏈接到一個(gè)或多個(gè)小黃瓜步驟。當(dāng)Cucumber在場景中執(zhí)行小黃瓜步驟時(shí),它將尋找一個(gè)匹配的步驟定義來執(zhí)行杠巡。
為了說明這是如何工作的剑勾,請看下面的小黃瓜場景:
Scenario: Some cukes
Given I have 48 cukes in my belly
作為step一部分的 I have 48 cukes in my belly
( Given
關(guān)鍵字后面的文本)將匹配以下步驟定義:
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);
});
}
}
表達(dá)式
步驟定義的表達(dá)式可以是正則表達(dá)式,也可以是Cucumber表達(dá)式虽另。如果使用正則表達(dá)式暂刘,則將匹配中的每個(gè)捕獲組作為參數(shù)傳遞給步驟定義的方法。
@Given("I have {int} cukes in my belly")
public void i_have_n_cukes_in_my_belly(int cukes) {
}
如果捕獲組表達(dá)式與已注冊參數(shù)類型的regexp相同捂刺,則捕獲的字符串將在傳遞給步驟定義的方法之前進(jìn)行轉(zhuǎn)換谣拣。在上面的示例中,cukes
參數(shù)將是一個(gè)整數(shù)族展,因?yàn)閮?nèi)置int
參數(shù)類型的regexp是\d+
森缠。
狀態(tài)管理
通過在實(shí)例變量中存儲狀態(tài),步驟定義可以將狀態(tài)傳遞給后續(xù)步驟定義仪缸。
范圍
步驟定義不鏈接到特定的功能文件或場景贵涵。文件、類或包名不影響步驟定義將匹配到什么小黃瓜步驟。唯一會影響的是步驟定義的表達(dá)式宾茂。
代碼片段
當(dāng)Cucumber遇到?jīng)]有匹配步驟定義的小黃瓜步驟時(shí)瓷马,它將打印一個(gè)帶有匹配Cucumber表達(dá)式的步驟定義片段。您可以將此作為新步驟定義參考跨晴。
考慮一下這個(gè)小黃瓜步驟:
Given I have 3 red balls
如果你沒有一個(gè)匹配的步驟定義决采,Cucumber會給出如下代碼片段作為參考:
@Given("I have {int} red balls")
public void i_have_red_balls(int int1) {
}
如果建議的代碼段與未定義步驟的部分匹配,則它們將使用您自己的參數(shù)類型坟奥。如果存在Color
參數(shù)類型树瞭,Cucumber會在建議的表達(dá)式中使用:
@Given("I have {int} {color} balls")
public void i_have_red_balls(int int1, Color color) {
}