對驗收測試、Gherkin及Spec Flow的介紹
驗收測試或功能測試是驗證系統是否滿足需求的一種測試。這些測試作為黑箱測試的一種,與其內部具體執行無關。驗收測試只是用來驗證系統是否符合某一需求。
現在我們一起看下面這個關於網頁登入功能的需求:
Feature: Login In order to access my account As a user of the website I want to log into the websiteScenario: Logging in with valid credentials Given I am at the login page When I fill in the following form | field | value | | Username | xtrumanx | | Password | P@55w0Rd | And I click the login button Then I should be at the home page
其可讀性非常強,是吧?以上的詳細需求是通過Gherkin語言來描述的。Gherkin是一種領特定領域語言,它允許我們在不解釋具體執行細節的情況下,詳細描述應用應該如何執行。以上詳細需求的大部分內容是由自由文字組成;只有幾個特定的Gherkin關鍵字:Feature、Scenario、Given、When、And和Then,其他的都是自由文字,並且主要記錄了功能特性是如何被使用的。
Gherkin是一種基於行的程式設計語言,情境中的每一行(Line)就是一個步驟(Step)。“Logging in with valid credentials”情境中的第一個步驟是“Given I am at the login page”。該步驟需要一個具體步驟定義,這樣我們的測試執行者(test runner)才能知道如何去完成該步驟。Spec Flow中的步驟定義其實就是一個帶有變數的方法,而該變數包含有該步驟的具體文本。所有步驟定義方法都需包含於一個含有Binding屬性的類中。
[Binding]class LoginStepDefinitions{ [Given("I am at the login page")] public void GivenIAmAtTheLoginPage() { // TODO }}
上面的類和方法名都是隨意的。真正重要的是應用到類和方法中的變數。如果沒有它們,Spec Flow就無法確認步驟定義方法和具體步驟的綁定關係。
現在就剩下步驟定義執行了。而這時候就該WatiN和Nunit上場了。
WatiN是一個基於瀏覽器的自動化工具。我們將利用它來開啟一個IE執行個體,瀏覽URL,填充表格,點擊按鈕或連結等。與此同時,我們將利用NUnit來斷言我們的期望。儘管如此,WatiN和NUnit並非是必需的。也可以使用Selenium進行瀏覽器自動化;而事實上,任何單元測試架構都可用來斷言,甚至可以使用Windows內建的應用自動化庫,比如:White,然後為相應的Windows Forms或WPF應用編寫自動化驗收測試。
現在我們就來嘗試為一個真實應用建立實際的驗收測試。針對本文,我們將使用該執行個體程式。讀者可以從這裡的repository擷取一份。該repository還包含完整的驗收測試工程,但是我還是建議通過執行本文剩下的內容來建立自己的驗收測試代碼。
先決條件
Spec Flow為所有支援的第三方測試回合器授權以運行真正繁重的驗收測試。正如前面所提的,我們將使用NUnit執行測試和WatiN自動化瀏覽器。以下就是如何使用WatiN自動化瀏覽器為WatiN執行Google查詢的例子(來自WaitN網站)。
[Test]public void SearchForWatiNOnGoogle(){ using (var browser = new IE("http://www.google.com")) { browser.TextField(Find.ByName("q")).TypeText("WatiN"); browser.Button(Find.ByName("btnG")).Click(); Assert.IsTrue(browser.ContainsText("WatiN")); }}
上面的測試建立了一個新IE執行個體,然後將Google的URL傳給構造器,然後由構造器讓瀏覽器跳轉到Google頁面。隨後尋找命名為“q”的文字框。該文字框就是你要輸入具體查詢內容的地方。找到該文字框後,輸入“WatiN”。緊接著,尋找命名為“btnG”的按鈕,然後點擊它。最後,由一個斷言來確定頁面上存在有“WatiN”(可以是頁面上任何地方)。
以上的代碼為我們快速展示了通過WatiN自動化常規任務是多麼的簡單,這些任務可以是在瀏覽器上執行例如填寫文字框、點擊按鈕等動作。
接下來,就可以在Visual Studio中為你的驗收測試建立新的類庫工程。當你下載完NUnit和WatiN後,你將需要添加必需的DLL到你的驗收測試工程中。從你的NUnit下載中添加一個nunit.framework.dll引用到你的驗收測試工程。對於WatiN,你則需要添加兩個DLL引用到你的驗收測試工程:Interop.SHDocVw.dll和WatiN.Core.dll。
值得一提的是,你可以通過NuGet擷取NUnit和WatiN這兩個項目。這兩個都很容易在NuGet中找到,並能自動添加到你的工程中。如果你已經在你的項目中使用NuGe了,大可以通過它下載這兩個項目。
從網站上擷取一份Spec Flow,然後安裝到你的系統中。跟NUnit和WatiN不同,你需要在系統中安裝Spec Flow,而不是簡單的拷貝Dll檔案。Spec Flow內建有某些工具,每次往項目中添加一個特性檔案,它都會建立相應的隱藏代碼檔案。另外,在你編輯特性檔案時,它還帶有一些文法高亮和其他調整。
成功安裝Spec Flow後,檢查安裝目錄(預設為Program Files)。裡面有一堆DLL檔案,但是你只需要添加該引用到你的工程中:TechTalk.SpecFlow.dll。