- SpecFlow 教程
- SpecFlow - 首頁
- SpecFlow - 簡介
- 測試驅動開發
- 行為驅動開發
- SpecFlow - Visual Studio 安裝
- Visual Studio 擴充套件安裝
- SpecFlow - 專案設定
- 其他專案依賴項
- SpecFlow - 執行器啟用
- SpecFlow - HTML 報告
- SpecFlow - 繫結測試步驟
- SpecFlow - 建立第一個測試
- 配置 Selenium Webdriver
- SpecFlow - Gherkin
- SpecFlow - Gherkin 關鍵字
- SpecFlow - 特性檔案
- SpecFlow - 步驟定義檔案
- SpecFlow - 鉤子
- SpecFlow - 背景說明
- 使用示例進行資料驅動測試
- 不使用示例進行資料驅動測試
- 表格轉換為資料表
- 表格轉換為字典
- 使用 CreateInstance 的表格
- SpecFlow - 使用 CreateSet 的表格
- SpecFlow 有用資源
- SpecFlow 快速指南
- SpecFlow - 有用資源
- SpecFlow - 討論
SpecFlow 快速指南
SpecFlow - 簡介
SpecFlow 是一個基於 BDD 模型構建的開源測試自動化工具。它主要用於為 .NET 構建的專案構建自動化測試。本教程將提供有關 SpecFlow 及其功能的知識。
Spec-Flow 主要用於構建、監控和執行人類可讀的驗收測試用例。它使用 **Gherkin** 建立,Gherkin 是一種純文字語言。SpecFlow 具有 Gherkin 解析器,可以執行 70 多種語言。我們可以透過 SpecFlow 的內建測試執行器和 **SpecFlow+ Runner** 執行我們的測試。
元件
SpecFlow 的主要任務是繫結用 Gherkin 編寫的特性檔案。SpecFlow+ Runner 是一個測試執行器,它具有執行功能和報告生成功能。它也是免費的,我們需要為此建立一個 SpecFlow 帳戶。
**SpecFlow+ LivingDoc** 是一組工具,可使 Gherkin 特性檔案保持可讀格式。這可以與團隊中不熟悉 Visual Studio 等工具的利益相關者共享。
**SpecFlow+ LivingDoc** 生成器是一組用於 SpecFlow 的外掛和工具,用於從 Gherkin 特性檔案生成文件。這不需要建立帳戶,並且可以輕鬆地與他人共享。
**SpecFlow+ LivingDoc Azure DevOps** 允許在 **Azure DevOps/TFS** 中檢視輸出。任何擁有系統訪問許可權的使用者都可以在需要時檢視規範。它是免費的,但需要一個 SpecFlow 帳戶。
在 Visual Studio 擴充套件中編輯特性
此外,SpecFlow 還具有 **Visual Studio 擴充套件**,提供以下附加功能:
步驟和關鍵字的智慧感知(自動完成)
為了方便使用 SpecFlow,智慧感知提供了在鍵入時查詢以限制建議列表的功能。智慧感知可用於 Gherkin 檔案、其關鍵字和程式碼檔案。
在 Visual Studio 中,單擊“編輯”,然後選擇“智慧感知”以獲取各種選項。
下圖顯示了 Gherkin 檔案中的智慧感知。
Gherkin 語法高亮顯示
突出顯示關鍵字、標籤、註釋、無界(紫色)步驟、有界(黑色)步驟、有界步驟引數(灰色斜體)。
特性檔案大綱和註釋
在 Visual Studio 中,“編輯”選單中的大多數專案都可以為 SpecFlow 中的特性檔案添加價值。我們可以使用 # 字元或內建快捷方式(如 **CTRL+K CTRL+V 或 CTRL+K + CTRL+V**)註釋和取消註釋特定行。
從“編輯”選單中有多個選項可自定義特性檔案的各個部分。
單擊“編輯”,然後選擇“大綱”選項。
我們可以定義自己的特性檔案模板,在建立新測試用例時開啟。
格式化表格
我們可以修改表格大小,並在鍵入列名並輸入其值時自動格式化表格。
但是 SpecFlow 不僅限於 Visual Studio,它也可以與 Mono 和 VSCode 一起使用。
SpecFlow - 測試驅動開發
**測試驅動開發** 也稱為 TDD。它包含以下步驟,需要逐一執行:
**步驟 1** - 建立測試。
**步驟 2** - 驗證測試是否失敗。
如果測試透過,則建立第二個測試。
如果測試失敗,則轉到步驟 3。
**步驟 3** - 修復測試以使其透過。
如果測試透過,則轉到步驟 4。
如果測試失敗,則跳轉到步驟 3。
**步驟 4** - 開始程式碼重構並重復所有上述步驟,直到開發完成。
TDD 的好處
TDD 的好處如下:
開發人員需要理解需求,以瞭解場景的結果應該是什麼以及如何測試它。
僅當所有測試用例透過且程式碼重構完成時,才會執行模組的實現。因此,在將其移至下一個測試之前,應先進行驗證和重構。
完成重構後,需要執行單元測試套件。
單元測試可以用作即時文件。
如果發現錯誤,則會建立一個測試以獲取錯誤的詳細資訊。指令碼將更新以透過測試。同時,還執行其他測試以確保修復不會破壞現有功能。
開發人員可以參與設計決策並在測試執行階段隨時對其進行改進,以確保應用程式正常工作。這樣做是為了提高產品的可維護性。
開發人員可以確定是否進行任何修改。這是因為,如果這影響了任何現有功能,它將透過執行測試反映出來。這樣可以快速解決錯誤。
透過連續執行測試,所有先前的錯誤修復也將得到驗證,並且可以避免類似的錯誤。
由於在開發階段進行了主要測試,因此在交付之前所需的測試時間很短。
TDD 的缺點
TDD 的缺點如下:
開發人員難以決定何時開始測試。
開發人員對要測試什麼感到困惑。
開發人員不知道是否涵蓋了所有需求規範。
開發人員不確定他們的程式碼是否增加了業務價值。
圍繞 TDD 的誤解
圍繞 TDD 的誤解如下:
誤解 |
事實 |
|---|---|
TDD 僅關注自動化測試。 |
TDD 是一種遵循測試優先方法的開發技術。 |
TDD 不包括設計。 |
TDD 具有根據需求進行的徹底研究和設計。設計在開發階段完成。 |
TDD 僅用於單元測試。 |
TDD 也用於系統和整合測試。 |
TDD 無法用於正統的測試專案。 |
TDD 用於敏捷開發。但它也可以用於傳統的測試專案。 |
TDD 被認為是一種工具。 |
TDD 是一種開發技術,每次新的單元測試通過後,它都會與自動化套件結合,只要程式碼發生修改並在重構活動後執行。 |
SpecFlow - 行為驅動開發
**行為驅動開發** 也稱為 BDD,具有以下**特性**:
提供共享的方法和工具,幫助建立開發人員、業務分析師和其他利益相關者之間的互動,共同努力進行產品開發。
確保交付的產品增加了必要的業務價值。
找出系統的功能以及如何開發它。
確保產品具有良好的外觀和結構。
檢查軟體的功能,並確保滿足終端使用者的期望。
BDD 方法
BDD 採用的主要方法如下:
基於示例的規範
它在互動中使用示例來描述軟體特性及其業務場景。這種方法有助於消除開發人員、測試人員、產品負責人、業務分析師和團隊中所有其他利益相關者之間對業務需求的任何知識差距。
測試驅動開發
在 BDD 的參考中,測試驅動開發將示例轉換為純文字和可執行規範。開發人員在實現新功能時將此作為文件參考。它有助於開發一個適當的程式碼庫以及一個迴歸套件。因此,在整個產品生命週期中,總體維護成本降低。
BDD 工具
SpecFlow 是一個開源的 BDD 工具之一。它包含一個遵循 **Gherkin** 語法的**特性**檔案。SpecFlow 的原始碼託管在 GitHub 上。它主要用於為 .NET 構建的專案構建自動化測試。在功能上類似於 **Cucumber**。
SpecFlow 中特性檔案的結構:
它包括特性、背景場景和兩個場景。特性檔案包含應用程式中特性的驗收標準。
SpecFlow - Visual Studio 安裝
在本章中,我們將瞭解 Visual Studio 的安裝過程和專案配置。
安裝
導航到以下連結: https://www.visualstudio.com/en-us/downloads/download-visual-studio-vs.aspx
對於 Visual Studio 的社群版,請單擊“社群”部分下的“免費下載”。
一個 .exe 檔案將下載到我們的系統中。雙擊它。
**Visual Studio 安裝程式** 彈出窗口出現。單擊“繼續”。下載和安裝過程開始。
安裝完成後,選擇.NET 桌面開發選項。然後點選安裝。
軟體包的下載和安裝將開始。
完成後,點選重新啟動。
從開始選單中,輸入Visual Studio。
點選Visual Studio,將出現歡迎螢幕。
同時,Visual Studio彈出視窗也會出現。如果您沒有現有的
帳戶,請點選現在不,以後再說連結並繼續。
選擇主題顏色,然後點選啟動Visual Studio。
專案配置
開啟Visual Studio登入頁面後,點選建立新專案。
我們將建立一個新的C#類庫。在搜尋框中輸入class library core。選擇類庫(.NET Core)選項,然後點選下一步。
指定專案名稱和位置,然後點選建立。
專案的程式碼實現
using System;
namespace ClassLibrary2 {
public class Class1 {
public int Number1 { get; set; }
public int Number2 { get; set; }
public int Subtraction() {
throw new NotImplementedException();
}
}
}
要構建此解決方案,請轉到生成選單,然後選擇生成解決方案。
將顯示生成成功的訊息,我們已成功在Visual Studio中建立了一個專案。
SpecFlow - Visual Studio擴充套件安裝
如前所述,Visual Studio擴充套件允許新增許多測試自動化所需的功能。此擴充套件適用於Visual Studio 2017和2019。
安裝
開啟Visual Studio並導航到擴充套件選單,然後點選管理擴充套件選項。
管理擴充套件彈出窗口出現。在搜尋框中輸入SpecFlow。搜尋結果填充後,點選下載。
下載完成後,我們需要重新啟動Visual Studio。安裝完成後,如果我們再次轉到管理擴充套件彈出視窗,可以在已安裝選項卡中找到此擴充套件。
此外,我們現在可以找到停用和解除安裝SpecFlow的選項。點選關閉退出。
SpecFlow - 專案設定
現在,我們將在之前構建的同一個專案中建立一個SpecFlow專案。
專案建立
右鍵點選解決方案資源管理器部分。點選新增選項。然後選擇新建專案。
在搜尋框中輸入SpecFlow,由於搜尋結果,SpecFlow專案將顯示。點選下一步繼續。
輸入專案名稱和位置,然後點選建立。
從建立新的SpecFlow專案彈出視窗的測試框架下拉列表中選擇SpecFlow+ Runner選項。然後點選建立。
解決方案資源管理器現在將有一個名為SpecFlowProject1的新專案建立。
專案資料夾
建立SpecFlow專案後,我們還會發現為該專案建立了一個定義良好的資料夾結構,其中包含驅動程式、依賴項、功能、鉤子等等。
SpecFlow - 其他專案依賴項
我們需要為SpecFlow專案建立對我們建立的類庫的專案引用。這對於測試專案中類庫中的類非常重要。
新增專案依賴項
在解決方案資源管理器中點選SpecFlowProject1專案。然後右鍵點選資料夾依賴項。選擇新增專案引用選項。
引用管理器彈出視窗開啟。選中類庫的複選框,然後點選確定。
構建和執行測試
接下來,轉到生成選單並選擇生成解決方案。我們應該獲得生成成功的訊息作為輸出。
導航到測試選單並選擇測試資源管理器選項。
我們應該能夠找到新增到SpecFlow專案的特性。透過在檢視中執行所有測試選項執行它們。執行狀態顯示為未執行,因為測試尚未執行。
特性之前的感嘆號表示該特性的測試執行正在等待。
SpecFlow - 執行器啟用
我們必須執行SpecFlow + Runner的啟用。導航到檢視選單,然後選擇輸出選項。
然後在顯示來自下拉列表中選擇測試。
我們應該獲得測試輸出以及執行程式的啟用連結。只有在專案設定時選擇了SpecFlow+ Runner,我們才能獲得此連結。
啟用連結
在瀏覽器上開啟啟用連結。我們應該導航到SpecFlow登入頁面。點選使用Microsoft登入。
點選是,允許Microsoft訪問我們的SpecFlow帳戶。
要設定帳戶,請提供所需的資訊。然後點選建立帳戶。
我們現在將成功啟用SpecFlow帳戶。
現在,如果我們再次從文字資源管理器執行測試,它將顯示正確的結果。
SpecFlow - HTML 報告
當所有測試執行完成後,SpecFlow會生成報告,其中包括測試結果的細目。
從資源管理器執行測試
要構建解決方案,請導航到生成選單,然後點選生成解決方案。
我們應該獲得生成成功的訊息。
導航到測試選單並選擇測試資源管理器選項。
我們應該能夠找到新增到SpecFlow專案的特性。透過在檢視中執行所有測試選項執行該特性。
結果如以下影像中突出顯示所示。
報告生成
轉到輸出選單,然後從顯示來自下拉列表中選擇測試。
總執行結果顯示在輸出控制檯中。它包含有關測試用例數量、總成功、忽略、跳過、失敗等等的資訊。還捕獲了執行發生的使用者和機器名稱。
此外,還顯示執行持續時間以及HTML報告和日誌檔案路徑的連結。
複製報告檔案路徑並在瀏覽器中開啟它。我們將獲得一份詳細的HTML報告,其中包含專案名稱、配置、執行開始時間、持續時間、執行緒數等等。
它將描述結果、測試時間線摘要和完整的特性摘要。
報告還包含錯誤摘要和場景摘要。它包含每個測試的成功率。要了解特定特性的詳細資訊,我們可以點選場景名稱(以連結形式提供)。
接下來,捕獲每個步驟的執行詳細資訊。每個步驟的詳細資訊都顯示為跟蹤和結果。
SpecFlow - 繫結測試步驟
特性檔案中的測試步驟
要訪問特性檔案中的步驟,請轉到解決方案資源管理器中的SpecFlow專案。然後點選特性資料夾。特性檔案將顯示。
特性檔案可用於以純文字格式記錄應用程式的預期特性,也可用於自動化。Given、Then、When等關鍵字用於在SpecFlow中使用Gherkin語言描述場景。
測試步驟繫結
上述特性檔案已由SpecFlow專案預設新增。它還會生成測試方法,這些方法將執行在特性檔案中定義的場景。右鍵點選Scenario關鍵字後的任意一行。然後點選轉到定義選項。
Visual Studio識別與此步驟對應的步驟定義。在此示例中,它將開啟CalculatorStepDefinitions類並移動到GivenTheFirstNumberIs方法。
SpecFlow - 建立第一個測試
我們現在將在類庫中建立一個執行兩個數字減法操作的檔案。
using System;
namespace ClassLibrary2 {
public class Class1 {
public int Number1 { get; set; }
public int Number2 { get; set; }
public int Subtraction(){
return Number1 - Number2;
}
}
}
特性檔案實現
步驟定義檔案實現
上述特性檔案的對應步驟定義檔案,以及使用Class1執行減法操作。
using ClassLibrary2;
using FluentAssertions;
using TechTalk.SpecFlow;
namespace SpecFlowCalculator.Specs.Steps {
[Binding]
public sealed class CalculatorStepDefinitions {
private readonly ScenarioContext _scenarioContext;
//instantiating Class1
private readonly Class1 _calculator = new Class1();
private int _result;
public CalculatorStepDefinitions(ScenarioContext scenarioContext) {
_scenarioContext = scenarioContext;
}
[Given("the first number is (.*)")]
public void GivenTheFirstNumberIs(int number){
_calculator.Number1 = number;
}
[Given("the second number is (.*)")]
public void GivenTheSecondNumberIs(int number){
_calculator.Number2 = number;
}
[When("the two numbers are subtracted")]
public void WhenTheTwoNumbersAreSubtracted(){
_result = _calculator.Subtraction();
}
[Then("the result should be (.*)")]
public void ThenTheResultShouldBe(int result){
_result.Should().Be(result);
}
}
}
執行測試
構建上述解決方案,然後在從測試→測試資源管理器獲得生成成功訊息後執行測試。
選擇SpecFlowProject1特性,然後點選在檢視中執行所有測試。
結果顯示為1透過以及執行持續時間。點選開啟此結果的其他輸出選項以獲取結果詳細資訊。
顯示每個測試步驟的執行結果。
特性檔案中的所有步驟都將執行,並顯示為已完成狀態。此外,步驟定義檔案中的對應方法也將顯示執行持續時間。
SpecFlow - 配置Selenium Webdriver
要在Visual Studio中配置Selenium Webdriver,我們將藉助NUnit框架。此框架允許在C#中執行Selenium測試。
配置NUnit框架
我們首先將建立一個NUnit專案。
開啟Visual Studio登入頁面後,點選建立新專案。
在建立新專案彈出視窗中出現的搜尋框中輸入NUnit。從搜尋結果中選擇NUnit測試專案(.NET Core)。點選下一步。
輸入專案名稱和位置。然後點選建立繼續。
在NUnit(.Net Core)上設定專案後,將預設定義Setup和Test方法。此外,語句using NUnit.Framework應顯示在頂部。這將證明NUnit框架已成功配置。
配置Selenium WebDriver
設定NUnit框架後,導航到工具選單,選擇NuGet包管理器,然後點選包管理器控制檯。
我們必須執行安裝Selenium Webdriver和NUnit所需的包管理器命令。
對於Selenium安裝,在包管理器控制檯中執行以下命令:
Install-Package Selenium.WebDriver Install-Package Selenium.Firefox.WebDriver
對於NUnit安裝,在包管理器控制檯中執行以下命令:
Install-Package NUnit Install-Package UUnit3TestAdapter
要檢查安裝狀態,請在包管理器控制檯中執行以下命令:
Get-Package
在C#中使用Selenium WebDriver實現
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using System;
namespace NUnitTestProject1{
public class Tests{
String u = "https://tutorialspoint.tw/index.htm";
IWebDriver d;
[SetUp]
public void Setup(){
//creating object of FirefoxDriver
d = new FirefoxDriver();
}
[Test]
public void Test1(){
//launching URL
d.Navigate().GoToUrl(u);
Console.WriteLine("Url launched");
}
[TearDown]
public void close_Browser(){
d.Quit();
}
}
}
執行和輸出
從測試->測試資源管理器執行上述程式碼。測試資源管理器中的輸出為:
點選開啟此結果的其他輸出連結,我們將獲得測試結果和標準輸出。
啟動的URL作為輸出獲取,如程式碼中使用Console.WriteLine方法實現的那樣。
SpecFlow - Gherkin
Gherkin是一組重要的關鍵字,用於構建規範的有意義的體系結構。每個關鍵字都轉換為像英語這樣的普通語言。
Gherkin中的規則
下面列出了一些Gherkin中的規則:
Gherkin中的文件以關鍵字開頭。
可以在特性檔案新行的開頭添加註釋。它們以空格或不帶空格後跟#符號和文字開頭。但是,到目前為止,在SpecFlow中無法新增塊註釋。
要縮排程式碼,可以使用空格或製表符。建議縮排使用兩個空格。
每個步驟的關鍵字後面的內容都有一個對應的程式碼塊。這稱為步驟定義。
Gherkin示例
以下是Gherkin示例:
Feature: Payment Functionality
# Example 1
Scenario: Member Payment Method
When a member is on Payment screen
Then the payment amount is displayed.
# Example 2
Scenario: Member Payment Dues
When a member is on Payment Due screen
Then the payable amount is displayed.
在上述示例中,Feature、Scenario、Given、When和Then被稱為Gherkin關鍵字。
SpecFlow - Gherkin 關鍵字
主要的Gherkin關鍵字有:
- Feature
- Scenario
- Rule(到Gherkin 6)
- Example或Scenario
- Background
- Scenario Outline
- Examples
- | 用於資料表
- """ 用於文件字串
- @ 用於標籤
- # 用於註釋
- Given
- When
- Then
- But
- And
Gherkin使用本地化支援多種語言,以上每個關鍵字在其各自語言中都有等效的術語。
讓我們探索一些重要的Gherkin關鍵字:
Feature
新增Feature是為了對應用程式的總體功能進行描述,並將相關的場景組合在一起。這是Gherkin文件中最重要的關鍵字。
Feature後面跟著一個冒號:符號,然後是關於該功能的簡短描述。我們可以新增多行以進行更多描述。這些在執行時不會被SpecFlow考慮,但會新增到html報告中。
完成Feature的描述後,我們應該用關鍵字Background、Example等開始新的一行。我們可以在Feature上方新增標籤,將類似的特性組合在一起,而不管檔案或目錄的結構如何。
標籤
標籤是新增到場景或功能的標記。為功能新增標籤就像將該標籤標記到該功能檔案中的每個場景一樣。標籤名稱在@符號後提及。
我們可以使用標籤過濾和組合要執行的測試。例如,我們可以用@important標記一個緊急測試,並經常執行它。SpecFlow將@ignore標籤視為一個重要的標籤,並根據帶有此標籤的場景生成一個被忽略的單元測試方法。
這裡,功能檔案包含兩個帶有@Calculator標籤的場景。同樣也應反映在Test Explorer中,以選擇要執行的測試。
Scenario
場景是一個完整的例項,描述了業務邏輯。它有多個步驟。它通常被認為是關鍵字Example的同義詞。場景沒有固定的步驟數量。但建議每個場景有3到5個步驟。
如果步驟太多,它可能會失去作為規範和文件的價值。場景就像開發生命週期中的一個測試。此外,它可以分為前提條件、測試步驟和驗證。
Given
Given是用於描述系統預先存在條件的步驟。它通常處理過去發生的事件。當執行Given步驟時,它應該設定資料庫中的物件、測試資料並使系統處於適當的狀態。
因此,Given步驟有助於在使用者與系統互動之前定義系統處於已知狀態。我們可以有多個Given步驟。兩個或多個Given步驟可以與And關鍵字一起使用。簡而言之,它用於定義前提條件。
When
When是用於描述操作或事件的步驟。這可以是人與系統的互動,也可以是另一個系統引起的事件。在一個場景中只有一個When步驟是一個好習慣。
如果我們被迫使用多個When步驟,我們應該理想地將場景分解成更小的場景。
Then
Then是用於描述預期結果的步驟。Then步驟對應的步驟定義應該有一個斷言來驗證實際結果與預期結果。
因此,它基本上處理從測試中獲得的輸出(訊息、報告等),而不是系統的內部特性,例如資料庫記錄。換句話說,它用於從終端使用者角度可以注意到的結果。
但是,And
如果我們重複了Given、When和Then步驟,那麼我們可以透過用And、But步驟替換連續的Given、When、Then步驟來使場景更有條理。
上面的示例顯示了And和But的使用。
* 符號
* 符號用於代替另一個步驟關鍵字。這可以用於表示專案列表的步驟。它更像是一個專案符號。對於下面的示例,兩個And步驟一個接一個地出現。
連續的And步驟應這樣表示:
Background
有時,我們可能需要在功能檔案中的所有場景中重複相同的步驟。我們可以透過將這些步驟組合在Background部分下將其移到後臺。
它有助於為場景新增上下文。它可以有多個Given步驟。因此,它將在每個場景執行之前執行,但在任何Before hooks之後執行。
Background位於第一個Example或Scenario之前,在相同的縮排級別。簡而言之,Background用於宣告所有測試的公共步驟。
在上面的示例中,有兩個場景,Background步驟將在每個場景執行之前執行一次。
Scenario Outline
Scenario Outline用於使用不同的資料集複製相同的場景。使用不同的值編寫相同的測試既麻煩又耗時。例如,
我們可以使用Scenario Outline組合以上兩個場景。
因此,我們看到Scenario Outline應該與關鍵字Examples一起使用。Scenario Outline為Examples部分下方出現的每一行執行一次。
此外,我們已經看到Given步驟具有<>分隔符。它指向Examples表的標題。SpecFlow將在匹配步驟與步驟定義的任務之前將值放入此表中。
資料表
資料表用於以列表的形式將一組值傳送到步驟定義檔案。它對於處理大型資料集很有用。SpecFlow在步驟定義檔案中有一個豐富的用於表操作的API。
SpecFlow Assist Helpers包用於處理表格。此外,我們還必須將名稱空間TechTalk.SpecFlow.Assist新增到我們的程式碼中。
SpecFlow - 特性檔案
SpecFlow測試執行從功能檔案開始。這裡所有功能及其相應的場景都以純文字形式解釋。它具有作為自動化元素以及文件的雙重作用。功能檔案包含一個或多個場景,以列表形式呈現。功能檔案的副檔名應始終為.feature。
新增Feature是為了對應用程式的總體功能進行描述,並將相關的場景組合在一起。這是Gherkin文件中最重要的關鍵字。
Feature後面跟著一個冒號:符號,然後是關於該功能的簡短描述。我們可以新增多行以進行更多描述。這些在執行時不會被SpecFlow考慮,但會新增到html報告中。
完成Feature的描述後,我們應該用關鍵字Background、Example等開始新的一行。我們可以在Feature上方新增標籤,將類似的特性組合在一起,而不管檔案或目錄的結構如何。
功能檔案建立
建立SpecFlow專案後,轉到解決方案資源管理器並展開它。
右鍵單擊Features資料夾。單擊新增,然後選擇新建項選項。
新增新項彈出窗口出現。在搜尋框中鍵入SpecFlow Feature。從搜尋結果中選擇SpecFlow Feature File選項。單擊新增並繼續。
功能檔案生成,預設情況下SpecFlow建立了一些步驟。
建立功能檔案後的專案資料夾
以下是建立功能檔案後的專案資料夾。
功能檔案主要由Gherkin關鍵字組成,以形成一個具有一個或多個場景的功能。
SpecFlow - 步驟定義檔案
要執行功能檔案,我們必須為每個步驟新增實現邏輯。為了在SpecFlow中新增步驟的定義,使用C#語言。因此,步驟定義檔案包含在類中用C#開發的方法。
這些方法具有註釋以及用於將步驟定義連線到每個匹配步驟的模式。SpecFlow將執行程式碼以執行Gherkin中的關鍵字。
步驟定義檔案是應用程式介面和功能檔案之間的橋樑。為了提供可讀性功能,步驟定義檔案可以具有引數。這意味著不需要為每個具有細微差異的步驟提供步驟定義。
例如,Given Login to admin application和Given Login to payment application步驟可以透過將admin和payment作為引數傳遞給一個步驟定義來自動化。正則表示式(.*)用於宣告方法的引數。
正則表示式的規則
正則表示式的規則如下:
即使我們沒有使用標記^和$,它也會與整個步驟匹配。
正則表示式中的捕獲組按順序描述方法的引數。
步驟定義方法的規則
步驟定義方法應遵循的規則如下:
它應該具有[Binding]屬性並位於公共類中。
它可以具有靜態或非靜態方法。如果它是非靜態方法,則應為其所在的類的每個場景例項化一個物件。
它不應該有ref或out引數。
它不能有返回值。
步驟定義檔案建立
右鍵單擊功能檔案的任何步驟,然後單擊生成步驟定義選項。
關於如何建立功能檔案的詳細資訊在第章 - 功能檔案中詳細討論。
在生成步驟定義骨架彈出視窗中,檢查我們想要為其生成實現的步驟。新增類名,然後單擊生成按鈕。
提供儲存步驟定義檔案的位置,然後單擊儲存。
步驟定義檔案將為功能檔案中的所有匹配步驟開啟。它還包含正則表示式屬性。
建立步驟定義檔案後的專案資料夾
以下是建立步驟定義檔案後的專案資料夾:
SpecFlow - 鉤子
鉤子是事件繫結,用於在某些步驟中新增更多自動化邏輯。例如,對於任何需要在特定場景之前執行的步驟。為了在程式碼中引入鉤子,我們必須新增[Binding]屬性。
鉤子具有全域性訪問許可權。但可以透過宣告作用域繫結使其對功能和場景可用。作用域繫結可以使用標籤進行過濾。
SpecFlow+ Runner 限制
如果我們使用SpecFlow+ Runner從多個執行緒執行測試,則After和Before鉤子(如BeforeTestRun和AfterTestRun)每個執行緒僅執行一次。
鉤子屬性
鉤子屬性如下:
BeforeTestRun/AfterTestRun - 用於在整個測試執行之前/之後執行自動化邏輯。它適用的方法應該是靜態的。
BeforeFeature/AfterFeature - 用於在單個功能執行之前/之後執行自動化邏輯。它適用的方法應該是靜態的。
BeforeScenario 或 Before/AfterScenario 或 After - 用於在單個場景或場景大綱執行之前/之後執行自動化邏輯。
BeforeScenarioBlock/AfterScenarioBlock - 用於在單個場景塊執行之前/之後執行自動化邏輯。(在When和Given步驟之間)。
BeforeStep/AfterStep - 用於在單個場景步驟執行之前/之後執行自動化邏輯。
鉤子執行順序
相同型別的鉤子,例如兩個AfterScenario鉤子,將以隨機順序執行。為了使執行按特定順序進行,我們必須在鉤子屬性中新增Order屬性。
示例
[AfterScenario(Order = 1)]
public void CloseBrowser() {
// we require this method to execute first...
}
[AfterScenario(Order = 2)]
public void VerifySessionIdAfterBrowserClose() {
// ...so we require this method to execute after the CloseBrowser //method is run
}
數字表示順序,這意味著具有最小數字的鉤子將首先執行。如果省略數字,則預設值為10000。依賴它不是一個好習慣,而是為各個鉤子指定順序。
此外,如果丟擲未處理的異常,則將跳過所有後續相同型別的鉤子。為了防止這種情況,我們應該處理所有異常。
SpecFlow - 背景說明
Background關鍵字用於在功能檔案中的所有場景之前複製相同的步驟。我們可以透過將這些步驟組合在Background部分下將其移到後臺。
它有助於為場景新增上下文。它可以有多個Given步驟。因此,它將在每個場景執行之前執行,但在任何Before hooks之後執行。
在第一個示例或場景之前會保留一個背景,並保持相同的縮排級別。簡而言之,它用於宣告所有測試的通用步驟。
在上面的示例中,有兩個場景,Background步驟將在每個場景執行之前執行一次。
背景規則
讓我們描述一些應用背景時的規則:
除非我們被迫將應用程式置於需要執行復雜步驟的狀態,否則應將其用於定義簡單的步驟。如專案利益相關者所要求的。
它應該簡潔且現實。
所有場景也應該簡明扼要。
背景示例
讓我們看一個示例,其中我們使用了背景步驟在特性檔案中所有測試之前執行。例如,要為應用程式新增普通使用者和管理員使用者,我們需要在執行“普通使用者新增”場景之前執行以下步驟:
啟動應用程式 URL。
提交使用者名稱和密碼
步驟 1:建立特性檔案
關於如何建立功能檔案的詳細資訊在第章 - 功能檔案中詳細討論。
Feature: Member addition
Background:
Given launch URL
Then enter name and password
Scenario: Normal user addition
Given user is on normal user addition screen
When enters normal user details
Then user should be added as normal user
Scenario: Admin user addition
Given user is on admin user addition screen
When enters admin user details
Then user should be added as admin user
步驟 2:建立步驟定義檔案
關於如何建立步驟定義檔案的詳細資訊在“步驟定義檔案”章節中有詳細討論。
using System;
using TechTalk.SpecFlow;
namespace SpecFlowProject1.Features{
[Binding]
public class MemberAdditionSteps{
[Given(@"launch URL")]
public void GivenLaunchURL(){
Console.WriteLine("Url launched");
}
[Given(@"user is on normal user additon screeen")]
public void GivenUserIsOnNormalUserAdditonScreeen(){
Console.WriteLine("User is on normal user addition screen");
}
[Given(@"user is on admin user addition screen")]
public void GivenUserIsOnAdminUserAdditionScreen(){
Console.WriteLine("User is on admin user addition screen");
}
[When(@"enters normal user details")]
public void WhenEntersNormalUserDetails(){
Console.WriteLine("User enters normal user details");
}
[When(@"enters admin user details")]
public void WhenEntersAdminUserDetails(){
Console.WriteLine("User enters admin user details");
}
[Then(@"enter name and password")]
public void ThenEnterNameAndPassword(){
Console.WriteLine("User enters name and password");
}
[Then(@"user should be added as normal user")]
public void ThenUserShouldBeAddedAsNormalUser(){
Console.WriteLine("User should be added as normal user");
}
[Then(@"user should be added as admin user")]
public void ThenUserShouldBeAddedAsAdminUser(){
Console.WriteLine("User should be added as admin user");
}
}
}
步驟 3:執行和結果
選擇SpecFlowProject(2),然後點選在檢視中執行所有測試。
選擇普通使用者新增場景,然後點選開啟此結果的附加輸出連結。
在上面的輸出中,背景步驟 - 給定 URL 啟動和然後輸入名稱和密碼在實際的普通使用者場景之前執行。
選擇管理員使用者新增特性,然後點選開啟此結果的附加輸出連結。
在上面的輸出中,背景步驟 - 給定 URL 啟動和然後輸入名稱和密碼在實際的管理員使用者場景之前執行。
SpecFlow - 使用示例進行資料驅動測試
我們可以藉助關鍵字示例執行資料驅動測試。我們還將藉助關鍵字場景輪廓在多個值上執行相同的場景。
要考慮的資料集應在“示例”部分下方逐個傳遞,並以|符號分隔。因此,如果有三行,我們將從單個場景執行三個測試用例。
Scenario Outline用於使用不同的資料集複製相同的場景。使用不同的值編寫相同的測試既麻煩又耗時。例如,
我們可以使用Scenario Outline組合以上兩個場景。
因此,我們看到Scenario Outline應該與關鍵字Examples一起使用。Scenario Outline為Examples部分下方出現的每一行執行一次。
此外,我們已經看到給定步驟有<>分隔符。它指向“示例”表的表頭。SpecFlow 將在將步驟與步驟定義匹配之前將此表中的值放入其中。
要驗證登入模組,我們需要執行以下步驟:
使用者輸入使用者名稱和密碼。
驗證使用者應該能夠登入。
我們將把上述步驟整合到特性檔案中。
步驟 1:建立特性檔案
關於如何建立功能檔案的詳細資訊在第章 - 功能檔案中詳細討論。
Feature: User credential Scenario Outline: Login module Given user types <username> and <password> Then user should be able to login Examples: | username | password | | tutorialspoint1| pwd | | tutorialspoint2| pwd1 |
步驟 2:步驟定義檔案
關於如何建立步驟定義檔案的詳細資訊在“步驟定義檔案”章節中有詳細討論。
using System;
using TechTalk.SpecFlow;
namespace SpecFlowProject1.Features{
[Binding]
public class UserCredentialSteps{
//regular expression used to point to data
[Given(@"user types (.*) and (.*)")]
public void GivenUserTypesUserAndPwds(string username, string password){
Console.WriteLine(username);
Console.WriteLine(password);
}
[Then(@"user should be able to login")]
public void ThenUserShouldBeAbleToLogin(){
Console.WriteLine("User should be able to login");
}
}
}
步驟 3:執行和結果
選擇使用者憑據(2),然後點選在檢視中執行所有測試。
選擇登入模組,tutorialspoint1 場景,然後點選開啟此結果的附加輸出連結。
該場景使用使用者名稱 - tutorialspoint1 和密碼 - pwd執行,如“示例”(第一行)中指定。
選擇登入模組,tutorialspoint2 場景,然後點選開啟此結果的附加輸出連結。
該測試使用使用者名稱 - tutorialspoint2 和密碼 - pwd1執行,如“示例”(第二行)中指定。
SpecFlow - 無需示例進行資料驅動測試
我們可以無需藉助關鍵字示例執行資料驅動測試。這可以透過將資料直接傳遞到特性檔案中的步驟(括在('')中)來完成。然後,它將作為輸入提供給步驟定義檔案。
讓我們驗證一個模組,該模組需要執行以下步驟:
- 使用者啟動 URL
- URL 應開啟
步驟 1:建立特性檔案
關於如何建立功能檔案的詳細資訊在第章 - 功能檔案中詳細討論。
Feature: Launching application Scenario: Launch URL Given User hits URL 'https://tutorialspoint.tw/index.htm' Then URL should be launched
步驟 2:建立步驟定義檔案
關於如何建立步驟定義檔案的詳細資訊在“步驟定義檔案”章節中有詳細討論。
using System;
using TechTalk.SpecFlow;
namespace SpecFlowProject1.Features{
[Binding]
public class LaunchingApplicationSteps{
[Given(@"User hits URL '(.*)'")]
public void GivenUserHitsURL(string url){
Console.WriteLine(url);
}
[Then(@"URL should be launched")]
public void ThenURLShouldBeLaunched(){
Console.WriteLine("URL should be launched");
}
}
}
步驟 3:執行和結果
選擇啟動應用程式特性,然後點選在檢視中執行所有測試。
選擇啟動 URL 場景,然後點選開啟此結果的附加輸出連結。
在上面的輸出中,獲取了 URL(https://tutorialspoint.tw/index.htm),該 URL 是直接從特性檔案中的給定步驟傳遞的。
SpecFlow - 表格轉換為資料表
表格經常與場景輪廓混淆。場景輪廓適用於整個測試,而表格僅適用於其定義下的單個步驟。
但是,需要構建程式設計邏輯來理解資料,然後才能將其整合到我們的測試中。示例關鍵字用於場景輪廓,但資料表不需要任何關鍵字。
SpecFlow 中的表格有多種可用方法,讓我們看看如何透過表頭將表格轉換為表格。
表格用於以列表形式將一組值傳送到步驟定義檔案。它對於處理大型資料集很有用。SpecFlow 在步驟定義檔案中有一個豐富的 API 用於表格操作。
SpecFlow Assist Helpers包用於處理表格。此外,我們還必須將名稱空間TechTalk.SpecFlow.Assist新增到我們的程式碼中。
步驟 1:建立特性檔案
關於如何建立功能檔案的詳細資訊在第章 - 功能檔案中詳細討論。
Feature: User credential Scenario: Login module When User types details | Name | Password | | t1 | pwd | | t2 | pwd1 |
然後使用者應該能夠登入。
步驟 2:建立 C# 檔案以訪問表格資料
我們必須透過System.Data包將表格轉換為資料表。我們將在專案中建立一個新資料夾,並在其中包含一個 C# 檔案。右鍵點選 SpecFlow 專案,然後點選新增。
選擇新建資料夾選項。
將資料夾命名為Utils。
右鍵點選建立的新資料夾,然後選擇新增選項。點選類。
在搜尋框中輸入C# 類並搜尋。從搜尋結果中選擇類選項,然後點選新增繼續。
專案資料夾結構
C# 類實現
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using TechTalk.SpecFlow;
namespace SpecFlowProject1.Utils {
class Class1 {
public static DataTable DT(Table t) {
var dT = new DataTable();
foreach (var h in t.Header) {
dT.Columns.Add(h, typeof(string));
}
// iterating rows
foreach (var row in t.Rows) {
var n = dT.NewRow();
foreach (var h in t.Header) {
n.SetField(h, row[h]);
}
dT.Rows.Add(n);
}
return dT;
}
}
}
步驟 3:建立步驟定義檔案
關於如何建立步驟定義檔案的詳細資訊在“步驟定義檔案”章節中有詳細討論。
using System;
using System.Data;
using TechTalk.SpecFlow.Assist;
using TechTalk.SpecFlow;
namespace SpecFlowProject1.Features {
[Binding]
public class UserCredentialSteps {
[When(@"User types details")]
public void WhenUserTypesDetails(Table t) {
//Accessing C# class method from Step Definition
var dTable = Utils.Class1.DT(t);
//iterating rows
foreach (DataRow r in dTable.Rows) {
Console.WriteLine(r.ItemArray[0].ToString());
Console.WriteLine(r.ItemArray[1].ToString());
}
}
[Then(@"user should be able to login")]
public void ThenUserShouldBeAbleToLogin() {
Console.WriteLine("User should be able to login");
}
}
}
步驟 4:執行和結果
選擇使用者憑據(1)特性,然後點選在檢視中執行所有測試。
選擇登入模組場景,然後點選開啟此結果的附加輸出連結。
該場景使用從特性檔案中的 When 步驟(轉換為資料表)的表格傳遞的資料執行。
SpecFlow - 表格轉換為字典
表格可以在特性檔案中以水平和垂直方向儲存資料。使用字典物件,我們將瞭解如何在特性檔案中以鍵值對的形式垂直訪問資料。
步驟 1:建立特性檔案
關於如何建立功能檔案的詳細資訊在第章 - 功能檔案中詳細討論。
Feature: User credential Scenario: Login module When User types details | KY | Val | | username | tutorialspoint | | password | pwd1 | Then user should be able to login
步驟 2:建立 C# 檔案以訪問表格資料
我們必須透過System.Collections.Generic包將表格轉換為字典。我們將在專案中建立一個新資料夾,並在其中包含一個 C# 檔案。右鍵點選SpecFlow 專案,然後點選新增。
選擇新建資料夾選項。
將資料夾命名為Utils。
右鍵點選建立的新資料夾,然後選擇新增選項。點選類。
專案資料夾結構
C# 類實現
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using TechTalk.SpecFlow;
namespace SpecFlowProject1.Utils {
class Class1 {
public static Dictionary<string, string> ToDT(Table t) {
var dT = new Dictionary<string, string>();
// iterating through rows
foreach (var r in t.Rows) {
dT.Add(r[0], r[1]);
}
return dT;
}
}
}
步驟 3:建立步驟定義檔案
關於如何建立步驟定義檔案的詳細資訊在“步驟定義檔案”章節中有詳細討論。
using System;
using TechTalk.SpecFlow;
namespace SpecFlowProject1.Features {
[Binding]
public class UserCredentialSteps {
[When(@"User types details")]
public void WhenUserTypesDetails(Table t) {
//Accessing C# class method from Step Definition
var dict = Utils.Class1.ToDT(t);
Console.WriteLine(dict["username"]);
Console.WriteLine(dict["password"]);
}
[Then(@"user should be able to login")]
public void ThenUserShouldBeAbleToLogin() {
Console.WriteLine("User should be able to login");
}
}
}
步驟 4:執行和結果
選擇使用者憑據(1)特性,然後點選在檢視中執行所有測試。
選擇登入模組場景,然後點選開啟此結果的附加輸出連結。
該場景使用從特性檔案中的 When 步驟(轉換為字典)的表格傳遞的資料執行。
SpecFlow - 使用 CreateInstance 的表格
CreateInstance<T>是 Table 方法的擴充套件。它將表格中的資料轉換為物件。它是垂直對齊資料引數化的一種常用技術。
SpecFlow Assist Helpers包用於處理表格。此外,我們必須將名稱空間TechTalk.SpecFlow.Assist新增到我們的程式碼中。
特性檔案中的表格標題可以是任何名稱,例如:KEY、VALUE。但是,第一列應指向屬性的名稱,第二列應指向其對應值。
步驟 1:建立特性檔案
關於如何建立功能檔案的詳細資訊在第章 - 功能檔案中詳細討論。
Feature: User credential Scenario: Login module When User types details | KEY | VALUE | | username | tutorialspoint | | password | pwd1 | Then user should be able to login
步驟 2:建立 C# 檔案以訪問字串物件
我們將在專案中建立一個新資料夾,並在其中包含一個 C# 檔案。右鍵點選SpecFlow 專案,然後點選新增。
選擇新建資料夾選項。
將資料夾命名為Utils。
右鍵點選建立的新資料夾,然後選擇新增選項。點選類。
在搜尋框中輸入C# 類並搜尋。從搜尋結果中選擇類選項,然後點選新增繼續。
專案資料夾結構
C# 類實現
using System;
using System.Collections.Generic;
using System.Text;
namespace SpecFlowProject1.Utils {
class Class1 {
public class Input {
//Declaring string objects
public string Input1 { get; set; }
public string Input2 { get; set; }
}
}
}
步驟 3:建立步驟定義檔案
關於如何建立步驟定義檔案的詳細資訊在“步驟定義檔案”章節中有詳細討論。
using System;
using TechTalk.SpecFlow;
using TechTalk.SpecFlow.Assist;
namespace SpecFlowProject1.Features {
[Binding]
public class UserCredentialSteps {
[When(@"User types details")]
public void WhenUserTypesDetails(Table t) {
//access data with CreateInstance method using C# class method
var i = t.CreateInstance<Utils.Class1.Input>();
Console.WriteLine(i.Input1);
Console.WriteLine(i.Input2);
}
[Then(@"user should be able to login")]
public void ThenUserShouldBeAbleToLogin() {
Console.WriteLine("User should be able to login");
}
}
}
步驟 4:執行和結果
選擇使用者憑據(1)特性,然後點選在檢視中執行所有測試。
選擇登入模組場景,然後點選開啟此結果的附加輸出連結。
該場景使用從特性檔案中的 When 步驟中使用 CreateInstance 方法傳遞的表格資料執行。
SpecFlow - 使用 CreateSet 的表格
CreateSet<T>是 Table 方法的擴充套件。它將表格中的資料轉換為一組物件。它是水平對齊資料引數化的一種常用技術。
我們可以使用此方法處理一行或多行資料。SpecFlow Assist Helpers包用於處理表格。此外,我們必須將名稱空間TechTalk.SpecFlow.Assist新增到我們的程式碼中。
CreateSet<T>方法根據表格中匹配的資料獲取IEnumerable<T>。它包含所有物件的值。它確保從字串到連結屬性的型別轉換正確。
步驟 1:建立特性檔案
關於如何建立功能檔案的詳細資訊在第章 - 功能檔案中詳細討論。
Feature: User credential Scenario: Login module When User types details | Name | Password | | t1 | pwd | | t2 | pwd1 | Then user should be able to login
步驟 2:建立 C# 檔案以訪問字串物件
我們將在專案中建立一個新資料夾,並在其中包含一個 C# 檔案。右鍵點選SpecFlow 專案,然後點選新增。
選擇新建資料夾選項。
將資料夾命名為Utils。
右鍵點選建立的新資料夾,然後選擇新增選項。點選類。
在搜尋框中輸入C# 類並搜尋。從搜尋結果中選擇類選項,然後點選新增繼續。
專案資料夾結構
C# 類實現
using System;
using System.Collections.Generic;
using System.Text;
namespace SpecFlowProject1.Utils {
class Class1 {
public class Input {
//two string objects declared
public string Input1 { get; set; }
public string Input2 { get; set; }
}
}
}
步驟 3:建立步驟定義檔案
關於如何建立步驟定義檔案的詳細資訊在“步驟定義檔案”章節中有詳細討論。
using System;
using TechTalk.SpecFlow;
using TechTalk.SpecFlow.Assist;
namespace SpecFlowProject1.Features {
[Binding]
public class UserCredentialSteps {
[When(@"User types details")]
public void WhenUserTypesDetails(Table t) {
//access Table data with CreateSet method
var i = t.CreateSet<Utils.Class1.Input>();
//iterate over rows
foreach (var r in i) {
Console.WriteLine(r.Input1);
Console.WriteLine(r.Input2);
}
}
[Then(@"user should be able to login")]
public void ThenUserShouldBeAbleToLogin() {
Console.WriteLine("User should be able to login");
}
}
}
步驟 4:執行和結果
選擇使用者憑據(1)特性,然後點選在檢視中執行所有測試。
選擇登入模組場景,然後點選開啟此結果的附加輸出連結。
該場景使用從特性檔案中的 When 步驟中使用 CreateSet 方法傳遞的表格資料執行。