如何在 Cucumber 的步驟之間共享數據
一、簡介
Cucumber 是一種支援行為驅動開發(BDD)方法的測試工具。 BDD 使非技術利害關係人能夠使用自然的領域特定語言來描述業務功能。
定義 Cucumber 測試的建構塊是功能、場景和步驟,必須用Gherkin語言編寫。在本教程中,我們將學習如何在 Cucumber 中的步驟之間共用資料。
2. 設定
我們將使用一個簡單的 Spring Boot 應用程式來處理事件,以展示如何在 Cucumber 步驟之間共用資料。我們將編寫 BDD 測試來驗證事件的生命週期,從事件進入我們系統時的初始狀態開始到處理後的最終狀態。
首先,讓我們定義我們的Event
類別:
public class Event {
private String uuid;
private EventStatus status;
// standard getters and setters
}
public enum EventStatus {
PROCESSING, ERROR, COMPLETE
}
當我們處理一個事件時,它會從初始的PROCESSING
狀態轉換到最終狀態,即COMPLETE
或ERROR
。
現在,讓我們編寫初始場景和步驟定義:
Scenario: new event is properly initialized
When new event enters the system
Then event is properly initialized
在下一節中,我們將了解如何在兩個步驟之間共用事件資料。
3. 使用 Spring 在步驟之間共用數據
@ScenarioScope
註釋允許我們在場景中的不同步驟之間共享狀態。此註釋指示 Spring 為每個場景建立一個新實例,使步驟定義能夠在它們之間共享數據,並確保不同場景之間的狀態不會洩漏。
在實現初始場景的步驟定義之前,我們還實作SharedEvent
測試類,它將儲存要在步驟之間共享的狀態:
@Component
@ScenarioScope
public class SharedEvent {
private Event event;
private Instant createdAt;
private Instant processedAt;
// standard getters and setters
}
SharedEvent
類別透過引入附加欄位createdAt
和processedAt
來補充Event
類,幫助我們定義更複雜的場景。
最後,讓我們定義場景中使用的步驟:
public class EventSteps {
static final String UUID = "1ed80153-666c-4904-8e03-08c4a41e716a";
static final String CREATED_AT = "2024-12-03T09:00:00Z";
@Autowired
private SharedEvent sharedEvent;
@When("new event enters the system")
public void createNewEvent() {
Event event = new Event();
event.setStatus(EventStatus.PROCESSING);
event.setUuid(UUID);
sharedEvent.setEvent(event);
sharedEvent.setCreatedAt(Instant.parse(CREATED_AT));
}
@Then("event is properly initialized")
public void verifyEventIsInitialized() {
Event event = sharedEvent.getEvent();
assertThat(event.getStatus()).isEqualTo(EventStatus.PROCESSING);
assertThat(event.getUuid()).isEqualTo(UUID);
assertThat(sharedEvent.getCreatedAt().toString()).isEqualTo(CREATED_AT);
assertThat(sharedEvent.getProcessedAt()).isNull();
}
}
運行功能文件,我們看到createNewEvent()
和verifyEventIsInitialized()
方法成功地透過SharedEvent
類別共享資料。
3.1.擴展場景
現在,讓我們更進一步,寫另外兩個場景,每個場景都有多個步驟:
Scenario: event is processed successfully
Given new event enters the system
When event processing succeeds
Then event has COMPLETE status
And event has processedAt
Scenario: event is is not processed due to system error
Given new event enters the system
When event processing fails
Then event has ERROR status
And event has processedAt
我們也將新的步驟定義加入到EventSteps
類別。這展示了額外的 Gherkin 功能,可提高步驟的可讀性和可重複使用性。
首先,讓我們實現When
步驟:
static final String PROCESSED_AT = "2024-12-03T10:00:00Z";
@When("event processing (succeeds|fails)$")
public void processEvent(String processingStatus) {
// process event ...
EventStatus eventStatus = "succeeds".equalsIgnoreCase(processingStatus) ?
EventStatus.COMPLETE : EventStatus.ERROR;
sharedEvent.getEvent().setStatus(eventStatus);
sharedEvent.setProcessedAt(Instant.parse(PROCESSED_AT));
}
字串“event processing (succeeds|fails)$”
是一個正規表示式,允許重複使用此步驟定義,符合“event processing succeeds”
和“event processing fails”
步驟。正規表示式末尾的$
字元確保步驟完全匹配,而不包含任何尾隨字元。
接下來,讓我們實作負責檢查processedAt
欄位的Then
步驟:
@Then("event has processedAt")
public void verifyProcessedAt() {
assertThat(sharedEvent.getProcessedAt().toString()).isEqualTo(PROCESSED_AT);
}
最後,我們新增最後一個Then
步驟,用於驗證事件狀態:
@Then("event has {status} status")
public void verifyEventStatus(EventStatus status) {
assertThat(sharedEvent.getEvent().getStatus()).isEqualTo(status);
}
@ParameterType("PROCESSING|ERROR|COMPLETE")
public EventStatus status(String statusName) {
return EventStatus.valueOf(statusName);
}
Cucumber 中的參數類型允許我們將方法參數從 Cucumber 表達式轉換為物件。 @ParameterType
status()
方法將String
轉換為EventStatus
枚舉值。這是使用步驟定義中的{status}
佔位符來呼叫的.
因此,我們的步驟定義將符合三個步驟:
-
event has PROCESSING status
-
event has COMPLETE status
-
event has ERROR status
新場景現已準備就緒,在運行它們時,我們注意到多個步驟成功共享資料。
4. 結論
在本教程中,我們學習如何在 Cucumber 中的步驟之間共用資料。此功能允許我們在場景中的步驟之間共享數據,同時保持多個場景之間的資料隔離。值得一提的是,步驟之間共享資料將它們緊密耦合,從而降低了它們的可重複使用性。
像往常一樣,完整的程式碼可以在 GitHub 上找到。