在情境之間共享狀態

不要這樣做。

情境必須彼此獨立,因此重要的是,情境之間不共享狀態。不小心將狀態從一個情境洩漏到其他情境,會使您的情境變得脆弱,並且也難以單獨執行。

為了防止意外洩漏情境之間的狀態

  • 避免使用全域或靜態變數。
  • 確保您在 Before 鉤子中清除資料庫。
  • 如果您在情境之間共享瀏覽器,請在 Before 鉤子中刪除 Cookie。

在步驟之間共享狀態

在您的情境中,您可能想要在步驟之間共享狀態。

可以在步驟定義內的變數中儲存狀態。

小心使用狀態

狀態會使您的步驟更緊密地耦合在一起,並且更難以重複使用。

依賴注入

PicoContainer

Spring

Guice

OpenEJB

Weld

Needle

如何使用 DI

使用自訂注入器

Cucumber 物件工廠

從命令列使用 Cucumber 物件工廠

使用 Cucumber 物件工廠屬性檔

使用測試執行器 (JUnit 5/JUnit 4/TestNG) 使用 Cucumber 物件工廠

事件匯流排

設定 UUID 產生器

定義您自己的 UUID 產生器

資料庫

有多個選項可以從您的資料庫移除狀態,以防止情境之間洩漏狀態。

Before 鉤子方法

建議在情境之間清除資料庫的方法是使用 Before 鉤子 在情境開始之前移除所有資料。這通常比使用 After 鉤子 更好,因為如果情境失敗,它允許您執行資料庫的事後檢查。

另一種方法是使用資料庫交易。

資料庫交易方法

如果您的資料庫支援,您可以將交易包裝在每個情境周圍

這可能會導致情境更快,但它會付出代價。您將無法執行事後檢查,並且將無法使用瀏覽器自動化

若要使用此方法,您需要在 Before鉤子中告訴 Cucumber 開始交易,然後在 After鉤子中稍後將其回滾。

這是如此常見的事情,以至於多個 Cucumber 擴充功能提供了使用名為 @txn 的標籤的現成條件鉤子

若要啟用它,您必須標記每個需要交易的 功能情境 加上 @txn

@txn
Feature: Let's write a lot of stuff to the DB

  Scenario: I clean up after myself
    Given I write to the DB

  Scenario: And so do I!
    Given I write to the DB

使用 JUnit 5 和 Spring

瀏覽器自動化和交易

如果您使用透過 HTTP 與您的應用程式對話的瀏覽器自動化工具,如果您的步驟定義和提供 HTTP 請求的 Web 應用程式各自都有自己的資料庫連線,則交易方法將不起作用。開啟交易後,交易永遠不會提交到資料庫 (但在每個情境結束時回滾)。因此,Web 伺服器的連線永遠不會看到來自 Cucumber 的資料,因此您的瀏覽器也不會看到。同樣地,Cucumber 的連線也看不到來自 Web 伺服器的資料。

在這種情況下,您必須關閉資料庫交易,並確保在每個情境之前明確刪除測試資料。

關閉交易

清除您的資料庫

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