Welcome

首页 / 软件开发 / .NET编程技术 / 数据点:用 SpecFlow 进行行为驱动设计

数据点:用 SpecFlow 进行行为驱动设计2014-03-10 MSDN Julie Lerman到目前为止,您已熟 悉我的偏好,即邀请开发人员到我在 Vermont 主持的用户组发表我感兴趣的话题。因此,产 生了有关 Knockout.js 和 Breeze.js 等主题的专栏。还有更多主题,如命令查询职责分离 (CQRS),我已仔细研读了一段时间。但最近架构师兼测试人员 Dennis Doire 谈到 SpecFlow 和 Selenium,测试人员可使用这两个工具进行行为驱动开发 (BDD)。我又一次睁大了眼睛, 开始在心里寻找玩耍这些工具的理由。话虽如此,我真正关注的还是 BDD。虽然我是数据驱 动方面的工作人员,但我从数据库向上开发应用程序的日子已经一去不返,我对关注这个领 域开始感兴趣。

BDD 是测试驱动开发 (TDD) 的一种变化形式,它关注用户情景以及围绕这些情景建立逻 辑和测试。您不是要满足一条规则,而是要满足多组活动。它非常整体化,而我喜欢这一点 ,因此这个方面让我产生了浓厚的兴趣。这个理念在于,虽然典型的单元测试有可能确保客 户对象的一个事件工作正常,而 BDD 关注的则是作为用户的我在使用为我建立的系统时所预 期的更为广泛的行为情景。BDD 经常在与客户讨论期间用于定义验收条件。例如,当我坐在 计算机前,填写“新建客户”窗体,然后按“保存”按钮时,系统应存储客户信息,然后向 我显示一条消息,表示已成功存储该客户。

或者,可能当我激活软件的“客户管理”部分时,该部分应自动打开我在上一个会话中处 理的最新客户。

从这些用户情景中可发现,BDD 可能是一种面向 UI 的方法,用于设计自动测试,但在设 计 UI 之前将编写许多方案。并且通过 Selenium (docs.seleniumhq.org) 和 WatiN (watin.org) 等工具,可在浏览器中自动进行测试。但 BDD 不仅是描述用户交互。若要详细了解 BDD 图片,请查看 InfoQ 上的小组讨论、BDD 和 TDD 的某些官方机构以及 bit.ly/10jp6ve 上的 Specification by Example。

我想脱离对按钮单击等问题的困扰,少量地重新定义用户情景。我可从情景中删除依赖于 UI 的元素,而关注流程中不依赖于屏幕的部分。当然,我感兴趣的是与数据访问相关的情景 。

构建用于测试满足特定行为的逻辑可能比较繁琐。Doire 在他的演示中介绍的一个工具是 SpecFlow (specflow.org)。此工具与 Visual Studio 集成,可通 过此工具的简单规则定义用户情景(称为方案)。然后,它自动创建和执行某些方法(有些 方法进行测试,有些方法不进行测试)。目标是验证满足情景的规则。

我将带领您创建一些行为以引起您的兴趣,如果您要详细了解,可在本文结尾找到一些资 源。

首先,需要将 SpecFlow 装入 Visual Studio,可从 Visual Studio 的“扩展和更新管 理器”中执行此操作。由于 BDD 的点是通过描述行为开始开发项目,因此解决方案中的第一 个项目是一个测试项目,将在该项目中描述这些行为。解决方案的其余部分将从该点继续。

使用“单元测试项目”模板新建一个项目。项目需要引用 TechTalk.SpecFlow.dll,可使 用 NuGet 安装该文件。然后,在此项目中创建一个名为 Features 的文件夹。

我的第一项功能将以有关添加新客户的用户情景为基础,因此在 Features 文件夹中,我 创建了另一个名为 Add 的文件夹(见图 1)。我将在此处定义方案并让 SpecFlow 帮助我。

图 1:具有 Features 和 Add 子文件夹的测试项目

SpecFlow 遵照一种依赖关键字的特定模式,这些关键字帮助描述要定义其行为的功能。 这些关键字来自一种名为 Gherkin(没错,就是泡菜里的小黄瓜)的语言,而所有这些都起 源于一种名为 Cucumber (cukes.info) 的工具。其中一些关键字为 Given、And、When 和 Then,并且您可使用这些关键字生成方案。例如,下面是一个简单的方案,封装在“添加新 客户”功能中:

Given a user has entered information about a customerWhen she completes entering more informationThen that customer should be stored in the system