先决条件
  Spec Flow为所有支持的第三方测试运行器授权以运行真正繁重的验收测试。正如前面所提的,我们将使用NUnit执行测试和WatiN自动化浏览器。以下是如何使用WatiN自动化浏览器为WatiN执行谷歌查询的例子(来自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。
  建立验收测试工程
  在我们进一步编写验收测试之前,我们需要建立我们的验收测试工程。我们将在工程中添加几个文件夹以便使项目更有条理。
  Features
  所有的说明都放在这个文件夹下。
  StepDefinitions
  所有情景步骤的步骤定义将放在这个文件夹下
  StepHelpers
  创建Spec Flow特性文件
  在Features文件夹中添加一个新的名字为Login.feature的Spec Flow特性文件。该文件带有针对场景中新增特性的规格说明。可以将其删除,然后添加以下文本。
  Feature: Login
  Feature在Gherkin中是关键字。它需要在每个feature文件中出现一次,紧接着它是一个冒号和其特性名。然后你可以通过任意行的自由文字来描述该特性。为了保持简易性,Gherkin的创建者建议用户尽量将文档保持短,并遵循以下格式:
  In order to realize a named business value
  As an explicit system actor
  I want to gain some beneficial outcome which furthers the goal
  个人看来,我更倾向于跳过上述描述,像登录这样能自我描述的特性,如果你尝试依据某一特定格式将其描述的话,反而让人困惑;有的时候很难区分出第一行中的“named business value”和第三行中你应描述的“beneficial outcome”之间的不同。需要记住的是该部分是自由文字,你可以任意描述。接下来让我们先跳过这一段,开始编写情景。
  Feature: Login
  Scenario: Logging in with valid credentials
  跟Feature一样,Scenario也是Gherkin的一个关键字,其后面紧接着一个冒号和其命名。跟Feature不同的是,scenario不能在一行中完成,它需要由各个步骤一起来完成scenario。我们可以想一想:我们需要做什么通过有效凭证来成功登录?
  填写登录表单
  点击登录按钮
  但是且慢,在我们能够填写登录表单前,我们需要打开有着登录表单的页面。之后,我们需要检查我们是否成功登录。可以假设在登录后,我们将被重定向到主页,从而意味着我们已经成功登录。
  现在我们的scenario有了前提条件(比如:我们必须在登录页面)和后置条件(比如:我们在主页)。Gherkin中,前提条件需从关键字Given开始,而后置条件需要由关键字When开始。
Feature: Login
Scenario: Logging in with valid credentials
Given I am at the 'Login' page
When I fill in the following form
| field    | value    |
| Username | testuser |
| Password | testpass |
And I click the 'Login' button
Then I should be at the 'Home' page
  是否注意到它的类表结构?Spec Flow会自动将第一行斜体化,该行在管道限制行中,并由管道开始。第一行为表头,紧接着各行中的每列将指代表头中定义的任意文本。比如,Password是field在第二行的内容,而testuser则是value列在第一行的值。
  同时,也应注意到由And开始的步骤。And关键字可以使用于任一步骤之后,并将被自动认为与前一步骤属于同一类型。如果And步骤紧接着Given步骤, 那么该步骤也被认为是一个Given步骤。在上述例子中,该And步骤被认为是When步骤。When步骤不用做pre或post条件,但是scenario需要这一部分用于进一步执行。
  创建第一个步骤定义
  现在我们完成了对Login特性的定义,但是我们的test runner还不知道如何执行该特性情景中的每一个步骤。我们需要为Login特性情景中的4个步骤一一定义。为了完成这个,我们将在Step目录中创建一个类,并将其命名为LoginSteps。为了让Spec Flow知道该类含有步骤定义,我们给该类绑定下Binding属性。该Binding属性属于TechTalk.SpecFlow命名空间的一部分。
using TechTalk.SpecFlow;
[Binding]
class LoginSteps
{
}