BDD中的常用工具2013-08-01什么是BDD?BDD在wikipedia上定义如下:BDD是第二代的、由外及内的、基于拉(pull)的、多方利益相关者的(stakeholder)、多种可扩展的、高自动化的敏捷方法。它描述了一个交互循环,可以具有带有良好定义的输出(即工作中交付的结果):已测试过的软件。简单一点地说,BDD,即行为驱动开发,是通过与产品经理沟通需求,定义出满足这些需求的软件需具备的行为(Behaviour),再以这些行为为驱动(Driven),编写产品代码来实现这些行为。(Development)。BDD的出现,是为了解决测试驱动开发中常遇到的问题,比如:从哪里开始测试,应该测试什么,不应该测试什么,等等。想了解更多可参见Dan North的introducing BDD。BDD实践所面临的问题进行BDD实践首先要解决如下几个问题:如何实现一个能够描述系统行为(业务价值)、非技术人员可读的测试?如何让这个测试变得可执行?业界对这些问题已经有了答案,JBehave, Cucumber,Concordian等BDD框架的出现,解决了这个问题。 这些BDD框架各自提供了一套DSL(Domain-Specific-Language),开发人员可以使用DSL描述业务需求,例如,
前置条件:用户A账户余额1000元用户B账户余额200元场景:用户A登录系统向用户B转账500元用户A账户余额应为500元用户B庄户余额应为700元
同时,这些框架都依赖于Webdriver(如selenium-webdriver,watir-webdriver),BDD框架通过webdriver调用浏览器的接口,模拟用户输入,读取浏览器页面上显示的内容用于验证。下面我们通过一个完整的例子来看看如何使用这些工具进行BDD实践的。Cucumber与业务价值在Behaviour Driven Development中,第一步就是把需求细分为多个任务,拿最常见的用户登录功能为例,可以划分为以下几个任务:用户名密码匹配,登录成功用户名或密码不匹配,登录失败BDD强调“每一个测试需要体现出业务价值”,因此,可以把上述两个任务实现为两个场景:
Feature: User loginBackground: There is a user with the following login detail:|email| password|| my@example.com| test|Scenario: Login succeedGiven the user login with the following detail:|email| password|| my@example.com| test|Then the user should login succeedScenario: Login failedGiven the user login with the following detail:|email| password || my@example.com| wrongpassword|Then the user should login failed
实际上,上面的这段代码就是使用cucumber的DSL描述的测试场景,几乎就是遵循了一定格式的英语,即使看不懂代码的产品经理、业务分析师也能够通过此文档和开发人员顺畅地交流。用Cucumber把一个需求的不同场景描述出来,也是从不同角度阐述了这个需求的业务价值。Cucumber的目标就是书写可执行的,能够表述业务价值文档。 与之类似的框架还有Concordian,JBehave等。紧接而来的问题是:如何让文档执行起来?Cucumber提供了把业务逻辑转换为可执行代码的机制——"step definition"。请看下面的例子:
Given /^the user login with the following detail:$/ do |detail|#omitting code…end
这个step definition会匹配下面这个step:
Given the user login with the following detail:|email| password|| my@example.com| test|
当Cucumber feature被执行的时候,这个step definition中的代码会被执行。那么,接下来的问题就是:如何象真实用户那样打开浏览器,输入用户名密码,点击提交按钮,验证登录是否成功。这时候,该Webdriver出场了。