- Cucumber 教程
- Cucumber - 首頁
- Cucumber - 概述
- Cucumber - 環境
- Cucumber - Gherkin
- Cucumber - 功能特性
- Cucumber - 場景
- Cucumber - 註解
- Cucumber - 場景大綱
- Cucumber - 標籤
- Cucumber - 資料表
- Cucumber - 註釋
- Cucumber - Hook
- Cucumber - 命令列選項
- Cucumber - JUnit 執行器
- Cucumber - 報告
- Cucumber - 除錯
- Cucumber - Java 測試
- Cucumber - Ruby 測試
- Cucumber 有用資源
- Cucumber - 快速指南
- Cucumber - 有用資源
- Cucumber - 討論
Cucumber - 功能特性
一個特性(Feature)可以定義為專案的一個獨立單元或功能。讓我們以社交網站這個非常常見的例子為例。這個產品/專案的特性是什麼樣的呢?一些基本特性可以確定為:
建立和刪除社交網站的使用者。
社交網站的使用者登入功能。
在社交網站上分享照片或影片。
傳送好友請求。
登出。
現在很清楚的是,在談論 Cucumber 時,被測產品的每個獨立功能都可以被稱為一個特性。這是一個最佳實踐,在你開始測試之後,在推匯出測試指令碼之前,我們應該確定要測試的特性。
一個特性通常包含該特性要測試的一系列場景。我們儲存特性、特性描述和要測試的場景的檔案被稱為特性檔案(Feature File)。我們將在下一章中詳細瞭解特性檔案。
在 Gherkin 中表示被測特性的關鍵字是“Feature”。建議的最佳實踐是在特性檔案中的特性標題下寫一個簡短的特性描述。這也能滿足良好文件的需求。
示例
特性(Feature) - 社交網站的登入功能。
如果使用者名稱和密碼正確,使用者應該能夠登入社交網站。
如果使用者名稱和密碼不正確,應該向使用者顯示錯誤訊息。
如果使用者名稱和密碼正確,使用者應該被導航到主頁。
特性檔案
編寫 Cucumber 測試的檔案被稱為特性檔案(Feature Files)。建議為每個被測特性建立一個單獨的特性檔案。特性檔案的副檔名需要是“.feature”。
可以根據需要建立任意數量的特性檔案。為了組織結構清晰,每個特性應該只有一個特性檔案。
例如:
| 序號 | 特性 | 特性檔名 |
|---|---|---|
| 1 | 使用者登入 | userLogin.feature |
| 2 | 分享帖子 | sharePost.feature |
| 3 | 建立賬戶 | createAccount.feature |
| 4 | 刪除賬戶 | deleteAccount.feature |
用於特性名稱和特性檔名的命名約定取決於個人的選擇。Cucumber 對名稱沒有硬性規定。
一個簡單的特性檔案包含以下關鍵字/部分:
特性(Feature) - 被測特性的名稱。
描述(Description) (可選) - 描述被測特性。
場景(Scenario) - 測試場景是什麼。
已知(Given) - 測試步驟執行之前的先決條件。
當(When) - 為了執行下一步而應該匹配的特定條件。
那麼(Then) - 如果 WHEN 中提到的條件滿足,應該發生什麼。
示例
特性(Feature) - 社交網站上的使用者登入。
當用戶名和密碼正確時,使用者應該能夠登入社交網站。
當用戶名和密碼不正確時,應該向使用者顯示錯誤訊息。
如果使用者名稱和密碼正確,使用者應該被導航到主頁。
大綱(Outline) - 社交網站的登入功能。
給定的使用者導航到 Facebook。當我輸入使用者名稱為“<username>”和密碼為“<password>”時。那麼,登入應該失敗。
| username | password | | username1 | password1 |
* AND 關鍵字用於顯示兩個條件之間的連線。AND 可以與其他關鍵字一起使用,例如 GIVEN、WHEN 和 THEN。
特性檔案中沒有編寫邏輯細節。
步驟定義
我們已經準備好包含已定義測試場景的特性檔案。但是,這並不是完成的工作。Cucumber 並不知道要為特性檔案中概述的任何特定場景執行哪一部分程式碼。
這就需要一箇中間件——步驟定義檔案。步驟定義檔案儲存特性檔案中定義的每個場景步驟與要執行的程式碼或函式之間的對映。
因此,現在當 Cucumber 執行特性檔案中提到的場景步驟時,它會掃描步驟定義檔案並確定要呼叫哪個函式。
步驟定義檔案的示例
public void goToFacebook() {
driver = new FirefoxDriver();
driver.navigate().to("https://#/");
}
@When "^user logs in using Username as \"([^\"]*)\" and Password as \"([^\"]*)\"$"
public void I_enter_Username_as_and_Password_as(String arg1, String arg2) {
driver.findElement(By.id("email")).sendKeys(arg1);
driver.findElement(By.id("pass")).sendKeys(arg2);
driver.findElement(By.id("u_0_v")).click();
}
@Then"^login should be unsuccessful$"
public void validateRelogin() {
if(driver.getCurrentUrl().equalsIgnoreCase(
"https://#/login.php?login_attempt=1&lwv=110")){
System.out.println("Test Pass");
} else {
System.out.println("Test Failed");
}
driver.close();
}
因此,對於每個函式,無論你想用每個測試步驟(即 GIVEN/THEN/WHEN)執行什麼程式碼,你都可以在步驟定義檔案中編寫它。確保為每個步驟定義了程式碼/函式。
此函式可以是 Java 函式,我們可以在其中使用 Java 和 Selenium 命令來自動化我們的測試步驟。