[翻译]Behavior-Driven Development (BDD)行为驱动开发(二)
测试驱动开发体现了开发人员对软件产品各部分运作方式的理解,而行为驱动开发则关注于开发人员对软件产品最终表现的行为的预期。
行为驱动开发
TDD更像是一种范式而不是一个过程。它描述了一种先编写测试,然后实现,并伴随可能的代码重构这样的一系列步骤。但其并没有关于以下的内容:
- 应该从哪里开始开发;
- 应该对什么进行测试;
- 测试应该怎样组织和命名。
测试驱动开发这个命名也让人疑惑,人怎么能够对不存在的东西进行测试呢。
Dan North对这些问题进行了研究,建议开发人员更应该考虑关注软件的特征行为而不是编写测试。
如果开发是行为驱动的,开发应该从对用户最重要的部分功能开始。可以看做放下开发者的帽子,而戴上用户的帽子,从用户的角度思考。实际上,分情况下,最难的部分也在此处,很多时候,你无法知道用户最关注的最重要的行为特性。但是,经过实践和多次的迭代,这一过程终将变得透明和有效。
那么接下来应该怎么表现行为了,一个基于Test::Unit的测试可能是这样的:
class UserTest < Test::Unit::TestCase
def test_name_set
user = User.new "Audrey"
assert_equal(user.name, "Audrey")
end
end
代码可以工作,但有一些缺陷:
- 代码中有多处Test,我们需要用具体的需求来替代;
- 语法难懂;
- 无法明白这段代码到底要测试什么内容。
在BDD中,行为应该随处可见,如下面的红色内容:
describe User do
it "lets me assign a name" do
user = User.new "Paul"
user.name.should == "Paul"
end
end
这段测试代码的价值在于:
- 关注点:针对于具体的行为进行测试和编码;
- 文档:通过读以上语句,你的同事可以直接理解行为的内容,甚至不需要读代码;
- 回归:当你之后运行所有的特性时,这就是回归测试。如果出现了问题,你很快就可以看到那个行为出错。
尽管测试语法对软件的功能行为特性做了描述,它需要一些工作来表明用户的意图。Dan North认为,可以通过定义一个模板通过自然语言来描述这些特性:
Story: Returns go to stock
In order to keep track of stock
As a store owner I want to add items back to stock when they're returned Scenario 1: Refunded items should be returned to stock
Given a customer previously bought a black sweater from me
And I currently have three black sweaters left in stock
When he returns the sweater for a refund
Then I should have four black sweaters in stock Scenario 2: Replaced items should be returned to stock
Given that a customer buys a blue garment
And I have two blue garments in stock
And three black garments in stock.
When he returns the garment for a replacement in black,
Then I should have three blue garments in stock
And two black garments in stock
每一个故事都有一个标题和简短的描述。描述的格式一般包括:
- 为了去实现……
- 对于你正在开发的……
- 我希望功能是这样的……
描述通过还附有一系列包含了给定步骤的场景,包含前置事件,用例行为,后置事件等。
由于BDD一直期望从用户最关注的行为开始,应该坚持以下准则:
- 找出最重要的特性;
- 在此基础上找出最重要的场景。
藉此,你可以一直站在用户需求的角度进行开发,并关注于真正有效的目标。
结论
很多人将BDD看做是“正确的TDD”,因为它包含了一系列以用户为中心的最佳开发实践,改变了以往技术方案为中心的方式,将用户意图当做首位。因此,将有助于创建更好的软件,实现用户的需求。
来源:http://blog.codeship.io/2013/04/22/from-tdd-to-bdd.html
[翻译]Behavior-Driven Development (BDD)行为驱动开发(二)的更多相关文章
- 【翻译稿】Behavior Driven Development (BDD)行为驱动开发
这是一篇翻译稿,方便给不知道BDD的同学扫盲.原文链接:What is BDD (Behavior Driven Development)? | Agile Alliance Definition定义 ...
- [翻译]Behavior-Driven Development (BDD)行为驱动开发(一)
简单而言,BDD是一系列基于TDD的工具和方法集发展而来的开发模式,一般不认为是一种新的开发模式,而是作为TDD的补充.因此,首先对TDD的概念进行进行. 测试驱动开发(TDD) TDD模式采取的是迭 ...
- Spring注解驱动开发(二)-----生命周期、属性赋值
bean的生命周期 bean的生命周期:bean创建---初始化----销毁的过程容器管理bean的生命周期:我们可以自定义初始化和销毁方法:容器在bean进行到当前生命周期的时候来调用我们自定义的初 ...
- 行为驱动开发iOS <收藏>
前段时间在design+code购买了一个学习iOS设计和编码在线课程,使用Sketch设计App,然后使用Swift语言实现Designer News客户端.作者Meng To已经开源到Github ...
- .NET里的行为驱动开发
BDD (Given - When - then) Ruby Cucumber, Java FitNesse , Python RoboFramework, C# specflow nspec .NE ...
- Linux 下wifi 驱动开发(三)—— SDIO接口WiFi驱动浅析
SDIO-Wifi模块是基于SDIO接口的符合wifi无线网络标准的嵌入式模块,内置无线网络协议IEEE802.11协议栈以及TCP/IP协议栈.可以实现用户主平台数据通过SDIO口到无线网络之间的转 ...
- 行为驱动开发BDD和Cucunber简介
测试驱动开发(TDD) 1.测试驱动开发,即Test-Driven Development(TDD),测试驱动开发是敏捷开发中的一项核心实践和技术,也是一种设计方法论.TDD的原理是在开发功能代码之前 ...
- 行为驱动开发BDD概要
BDD脱胎于TDD 行为驱动开发(Behavior-Driven Development,简称BDD),是在测试驱动开发(Test-Driven Development,TDD)基础上发展而来的一种软 ...
- Bug驱动开发(Bug-driven development)
说实话,作为一个Domino开发者,像測试驱动开发(Test-driven development).功能驱动开发(Feature-driven development)之类软件开发的高大上的方法论( ...
随机推荐
- java socket编程基础
1. [代码]读操作Runable 1 package com.hrd.test.socket; import java.io.BufferedReader; import java.io.IOExc ...
- 【转载】Redis的一些使用场景
看了一些文章,关于Redis的使用场景,觉得挺好的.Redis肯定远远不止作为缓存而使用.Redis更像是一个实现很好的数据结构服务器,通过TCP栈协议提供服务.下面进行详细描述. http://da ...
- hdu 5091(线段树+扫描线)
上海邀请赛的一道题目,看比赛时很多队伍水过去了,当时还想了好久却没有发现这题有什么水题的性质,原来是道成题. 最近学习了下线段树扫描线才发现确实是挺水的一道题. hdu5091 #include &l ...
- JavaScript判断浏览器类型及版本
JavaScript是前端开发的主要语言,我们可以通过编写JavaScript程序来判断浏览器的类型及版本.JavaScript判断浏览器类型一般有两种办法,一种是根据各种浏览器独有的属性来分辨,另一 ...
- Linux 查找文件方法
1) find -name httpd.conf 2) find /etc -name "*repo" 详情查找命令-> http://www.yesky.com/210/1 ...
- T-SQL备忘(5):查看执行计划
先理解几个概念:表扫描.聚集索引扫描.聚集索引查找.索引扫描.书签查找. [查看执行计划] 在理解概念之前先得知道如何查看执行计划—Ctrl+L.如下图: 注:SQL Server的执行计划是从右向左 ...
- 五个JS经典面试题
1:Scope作用范围 1: (function() { 2: var a = b = 5; 3: })(); 4: 5: console.log(b); 什么会被打印在控制台上? 回答 上面的代码会 ...
- PHP开发规范
十.开发规范下面我们讲解 Yii 编程中推荐的开发规范.为简单起见,我们假设 WebRoot 是 Yii 应用安装的目录.1.URL默认情况下,Yii 识别如下格式的 URL: http://host ...
- 职业操盘手内部教材 z
重 点抢筹区: 是主力机构在低位拉高建仓后的一个相当尴尬的区域!因为在这个区域,场外的绝大多数投资者不敢买,而场内持有的人却很想卖!所以会出现成片的卖盘挂单! 由于主力向上做的意图已经非常明显,所 ...
- C++模板实例掌握
前段时间重新学习C++,主要看C++编程思想和C++设计新思维.对模版的使用有了更进一层的了解,特总结如下: 下面列出了模版的常用情况: << '\n';} //参考:http://ww ...