简单而言,BDD是一系列基于TDD的工具和方法集发展而来的开发模式,一般不认为是一种新的开发模式,而是作为TDD的补充。因此,首先对TDD的概念进行进行。

测试驱动开发(TDD)

TDD模式采取的是迭代式的开发流程。软件的每个功能特性的开发都是从编写一个针对性的测试开始。一开始测试无法通过,然后开发人员通过以下步骤进行迭代:

1.编写测试,观察是否未通过;

2.实现早期版本,以便通过测试;

3.如果需要,重构部分代码。继续编写其他测试。

简单示例(基于Ruby)

假设我们要开发一个用户管理的功能,一个用户需要通过姓名进行初始化,以便后续可以使用姓名进行检索。

第一个测试:

describe User do
  it "lets me assign a name" do
    user = User.new "Paul"
    user.name.should == "Paul"
  end
end


运行后会报错

uninitialized constant User

编写测试时,请总是确保该测试首次运行时是肯定失败的,这意味着你不是对一个已经成功的功能进行测试。接下来,编写user的内容:

class User
end

继续测试,并报错:

ArgumentError: wrong number of arguments (1 for 0)


然后实现一个能够接受姓名作为参数的构造器:

class User
def initialize name
end
end

继续测试,会给出错误。

NoMethodError: undefined method 'name'

然后添加函数name后,测试结果如下:

user.name.should == "Paul" expected: "Paul" got: nil

接下来必须为name赋值,最后得到:

class User
def initialize name
end def name
"Paul"
end
end

尽管这个用户永远都叫Paul,还有未实现的细节,之前编写的测试确实顺利通过。根据TDD的原则,我们现在可以对代码进行重构。具体的代码不再介绍,但是首先必须先添加测试:

describe User do
it "lets me assign a name" do
user = User.new "Paul"
user.name.should == "Paul"
end it "lets me assign a different name" do
user = User.new "Sarah"
user.name.should == "Sarah"
end
end

继续测试,还是得到错误:

user.name.should == "Sarah" expected: "Sarah" got: "Paul"

这是意料中的错误,所以继续修改,直到测试通过:

class User
def initialize name
@name = name
end def name
@name
end
end

到这里我们完成了期望的功能。但是,代码的重构没有停止,Ruby提供了以后简单的读属性的方法attr_reader。因此,重构的代码如下:

class User
attr_reader :name def initialize name
@name = name
end
end

TDD的理由

测试驱动开发的步骤看起来很繁冗,那需要我们这么做的理由是什么呢?

许多应用程序在开发的初始阶段看起来很细琐但是简介,然而几周后就变成了垃圾堆,充满了无法预料的“惊喜”。惟一的解决之道,就是在每次代码编写后手动的测试,你或许会花费几周的时间用来进行测试。

TDD让开发人员更加敏捷,谨慎而缓慢的的开始,可以避免在后期踩上埋藏很深的地雷。重要的是,哪怕是几年后你的应用程序变得庞大而又繁杂,甚至丢失了所有的信息资料,你的测试仍然可以保证程序可以正常运行。

TDD和持续集成

测试的惟一问题在于,随着时间推移,需要花费的时间成倍的增长。想要执行所有测试,可能会花费很长的时间。一个好的解决方案就是引入CI(Continuous Integration)。在此基础上,还可以引入自动编译、部署等方案,以便减少人工干预,自动化的执行测试和后续流程。

结论

TDD的优势在于通过额外的努力获得长期的回报,并获得应用程序的敏捷、速度和安全性。

来源:http://blog.codeship.io/2013/04/16/tests-make-software.html

[翻译]Behavior-Driven Development (BDD)行为驱动开发(一)的更多相关文章

  1. 【翻译稿】Behavior Driven Development (BDD)行为驱动开发

    这是一篇翻译稿,方便给不知道BDD的同学扫盲.原文链接:What is BDD (Behavior Driven Development)? | Agile Alliance Definition定义 ...

  2. [翻译]Behavior-Driven Development (BDD)行为驱动开发(二)

    测试驱动开发体现了开发人员对软件产品各部分运作方式的理解,而行为驱动开发则关注于开发人员对软件产品最终表现的行为的预期. 行为驱动开发 TDD更像是一种范式而不是一个过程.它描述了一种先编写测试,然后 ...

  3. 行为驱动开发iOS <收藏>

    前段时间在design+code购买了一个学习iOS设计和编码在线课程,使用Sketch设计App,然后使用Swift语言实现Designer News客户端.作者Meng To已经开源到Github ...

  4. .NET里的行为驱动开发

    BDD (Given - When - then) Ruby Cucumber, Java FitNesse , Python RoboFramework, C# specflow nspec .NE ...

  5. 行为驱动开发BDD和Cucunber简介

    测试驱动开发(TDD) 1.测试驱动开发,即Test-Driven Development(TDD),测试驱动开发是敏捷开发中的一项核心实践和技术,也是一种设计方法论.TDD的原理是在开发功能代码之前 ...

  6. 行为驱动开发BDD概要

    BDD脱胎于TDD 行为驱动开发(Behavior-Driven Development,简称BDD),是在测试驱动开发(Test-Driven Development,TDD)基础上发展而来的一种软 ...

  7. Bug驱动开发(Bug-driven development)

    说实话,作为一个Domino开发者,像測试驱动开发(Test-driven development).功能驱动开发(Feature-driven development)之类软件开发的高大上的方法论( ...

  8. 行为驱动开发(BDD)

    行为驱动开发(BDD) 引言 BDD是对TDD理念的扩展.BDD强调有利害关系的技术团体和非技术团队都要参与到软件开发过程中.可以把它看成一种强调团体间合作的敏捷方法.大多数采用某种敏捷方法的团队最终 ...

  9. 行为驱动开发(BDD) - 深入了解

    行为驱动开发(BDD) - 一个快速的描述和示例 BDD表示乙 ehavior ð里文ð才有发展.用于描述行为的语法是Gherkin. 这个想法是尽可能自然地描述一种语言应该发生什么. 如果你熟悉单元 ...

随机推荐

  1. HDU 2897 (博弈 找规律) 邂逅明下

    根据博弈论的两条规则: 一个状态是必胜状态当且仅当有一个后继是必败状态 一个状态是必败状态当且仅当所有后继都是必胜状态 然后很容易发现从1开始,前p个状态是必败状态,后面q个状态是必胜状态,然后循环往 ...

  2. HDU 1160 FatMouse's Speed

    半个下午,总算A过去了 毕竟水题 好歹是自己独立思考,debug,然后2A过的 我为人人的dp算法 题意: 为了支持你的观点,你需要从给的数据中找出尽量多的数据,说明老鼠越重速度越慢这一论点 本着“指 ...

  3. POJ3592 Instantaneous Transference tarjan +spfa

    链接:http://poj.org/problem?id=3592 题意:题目大意:给定一个矩阵,西南角为出发点,每个单位都有一订价值的金矿(#默示岩石,不成达,*默示时佛门,可以达到指定单位),队# ...

  4. Context上下文对象(抄书的)

    Servlet上下文 ServletContext 上下文接口    ServletContext接口    每一个应用都有唯一的一个上下文对象,即为ServletContext对象    Servl ...

  5. C++ 编写Windows service

    最近实现一个windows server端守护进程启动服务功能(c++实现),遇到了一些问题,记录一下 1. 启动Service实现代码: int _tmain(int argc, TCHAR* ar ...

  6. OpenGL ES之GLSurfaceView学习一:介绍

    原文地址::http://120.132.134.205/cmdn/supesite/?uid-5358-action-viewspace-itemid-6527 GLSurfaceView是一个视图 ...

  7. 手动编译Spring4.2源码,以及把源码导入myEclipse中

    前提条件,先在本地配置好JDK1.8, 安装好Git 执行下面命令: 1,双击Git Bash, 进入源码存放路径 cd E:\Foler 2,git clone git@github.com:spr ...

  8. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:4.安装Oracle RAC FAQ-4.2.Oracleasm Createdisk ASM磁盘失败:Instantiating disk: failed

    1.错误信息:Instantiating disk: failed [root@linuxrac1 /]# /usr/sbin/oracleasm createdisk OCR_VOTE /dev/s ...

  9. Java Web 乱码

    1.mySql编码 2.jdbc编码 http://www.blogjava.net/NicholasEcho/archive/2008/11/03/238310.html ----- 1.HttpG ...

  10. XRPictureBox z

    XRPictureBox 大小加入是40x40  我绑定的图片好比是60X50 , 在不自己写代码的情况下,XRPictureBox 有没有什么属性可以调整,比如像SizeMode那种? // Set ...