对验收测试、Gherkin及Spec Flow的介绍
  验收测试或功能测试是验证系统是否满足需求的一种测试。这些测试作为黑盒测试的一种,与其内部具体执行无关。验收测试只是用来验证系统是否符合某一需求。
  现在我们一起看下面这个关于网页登录功能的需求:
Feature: Login
In order to access my account
As a user of the website
I want to log into the website
Scenario: 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还包含完整的验收测试工程,但是我还是建议通过执行本文剩下的内容来创建自己的验收测试代码。