《Cucumber:行为驱动开发指南》——1.2 行为驱动开发

1.2 行为驱动开发

行为驱动开发(Behaviour-Driven Development,BDD)1建立于测试驱动开发的基础之上,它标准化了那些优秀TDD实践者的良好习惯。优秀的TDD实践者以自外向内的方式开发软件,最初他们会编写一个失败的客户验收测试,该测试从客户的视角描述系统的行为。作为BDD实践者,我们细心编写验收测试,作为所有团队成员都能读懂的实例。我们使用这个编写实例的过程来获取业务人员的反馈,以便在开始实现软件之前,我们就知道自己是否是在编写正确的软件。在此过程中,我们会主动开发一种共享的通用语言(ubiquitous language)来描述和讨论我们开发的系统。

1.2.1 通用语言
正如Eric Evans在他的《领域驱动设计》[Eva03]一书中所描述的,很多软件项目都受过团队中领域专家和开发人员之间低质量沟通之苦:

“如果一个项目中的语言是支离破碎的,那么这个项目就面临着严重的问题。领域专家使用他们的行话,技术团队成员则拥有自己的、专门从设计角度讨论领域的语言……由于这种语言方面的分歧,领域专家描述他们的需求的时候非常模糊。开发人员努力尝试理解一个全新的领域,却只能得到模糊的结果。”

通过整个团队的自觉努力,项目涉及的所有人都能理解和使用的一款通用语言就会出现。如果整个团队在所有交谈、文档及代码中一致地使用这种语言,就不需要再花精力去翻译各自的不同方言,理解错误的概率也因此大大地降低了。

Cucumber为存在语言分歧的双方提供了可以会合的场所,从而促进了通用语言的发现和使用。Cucumber测试直接与开发人员的代码交互,同时它们又是用一种利益相关人能够理解的中间语言编写的。通过一起编写测试的方式,即协作描述(specifying collaboratively),团队成员不仅确定了下一步要实现的行为,也学会了怎样用一种大家都能理解的通用语言描述这种行为。

如果我们在开发开始之前就编写验收测试,就可以在错误的理解渗入代码之前发现并消灭它们。

1.2.2 实例
Cucumber之所以能从大量的测试工具中脱颖而出,是因为它在设计时有一点非常明确,就是确保团队中的任何人都能够很容易地阅读或编写验收测试。这符合验收测试的本质——作为一种交流和协作的工具。Cucumber测试的易读性把利益相关人吸引到协作过程中来,帮助大家探索并真正理解他们的需求。

下面是一个Cucumber验收测试的实例:

Feature: Sign up

 Sign up should be quick and friendly. 

 Scenario: Successful sign up

  New users should get a confirmation email and be greeted
  personally by the site once signed in.

  Given I have chosen to sign up

  When I sign up with valid details
  Then I should receive a confirmation email
  And I should see a personalized greeting message

 Scenario: Duplicate email

  Where someone tries to create an account for an email address
  that already exists.

  Given I have chosen to sign up
  But I enter an email address that has already registered
  Then I should be told that the email is already registered
  And I should be offered the option to recover my password

注意测试是如何描述为特定场景下我们期望的系统行为的实例(example)的。类似的实例能够强有力地帮助人们在系统被构建之前就将其形象化,效果通常超出大家的预期。任何团队成员都能阅读这样的测试,然后说出该测试是否反映了他对系统行为的理解,这样的测试也许还会激发他们进一步的思考,从而发现其他你未曾考虑的场景。Gojko Adzic的《实例化需求》一书包含了很多这方面的案例研究,案例中涉及的团队发现了实例的优点并将其充分利用。

以这种风格编写的验收测试已经不仅仅是测试了,它们是可执行的规格说明(executable specification)。

时间: 2024-08-02 16:41:43

《Cucumber:行为驱动开发指南》——1.2 行为驱动开发的相关文章

《智能路由器开发指南》——第2章 开发环境及编译分析 2.1 安装编译环境

第2章 开发环境及编译分析 如果你想从事智能路由器OpenWrt开发,首先必须掌握如何编译OpenWrt.本章将从搭建环境,到编译代码,再到安装部署运行以及VirtualBox虚拟网络环境的搭建,一步一步地教你如何进入到OpenWrt大门. OpenWrt是一个针对嵌入式设备的Linux发行版.OpenWrt提供了非常方便的开发环境,使用流行的Linux操作系统Ubuntu即可搭建好编译环境.OpenWrt有非常多的平台适应性,可以运行在ARM/MIPS/X86平台上,因此我们的研发网络部署也可

JNI/NDK开发指南(一)—— JNI开发流程及HelloWorld

                转载请注明出处:http://blog.csdn.net/xyang81/article/details/41777471        JNI全称是Java Native Interface(Java本地接口)单词首字母的缩写,本地接口就是指用C和C++开发的接口.由于JNI是JVM规范中的一部份,因此可以将我们写的JNI程序在任何实现了JNI规范的Java虚拟机中运行.同时,这个特性使我们可以复用以前用C/C++写的大量代码.        开发JNI程序会受

FleaPHP 开发指南 - 5. 应用程序设置

程序|开发指南 FleaPHP 是一个具有高度灵活性的框架.开发者可以用不同的设置来调整 FleaPHP 的工作方式.这些设置统一保存在名为"应用程序设置"的数据源中. 实际上,除了 FleaPHP 框架本身,应用程序也可以使用"应用程序设置"来保存应用程序运行时需要的各种设置. FleaPHP 的应用程序设置有一个默认配置文件,保存在 FLEA/Config/Default_APP_INF.php 中.应用程序可以在入口文件(例如 index.php)中修改这些设

关于《Swift开发指南》背后的那些事

时间轴(倒叙)2014年8月底在图灵出版社的大力支持下,全球第一本全面.系统.科学的,包含本人多年经验的呕心沥血之作<Swift开发指南>(配有同步视频课程和同步练习)全线重磅推出2014年7月5日苹果宣布Swift语言二十天后,<Swift开发指南>第一稿交予图灵出版社2014年6月9日苹果宣布Swift语言三天后,启动<Swift开发指南>撰写2014年6月2日凌晨1点(北京时间:)在苹果开发者大会WWDC 2014上,苹果宣布了全新的iOS及OS X平台开发语言S

可用性web表单的设计开发指南

可用性web表单的设计开发指南.表单在web设计中引发的讨论已经持续了10年,本文中罗列了多条原则,包括布局,验证,代码可读性,使用jquery来改良表单等. Two-Column vs. One This decision will generally depend on the content of the form, but it's often preferable to avoid a two-column layout if the form is fairly simple. Be

Struts开发指南之MVC架构

模型-视图-控制器(MVC)是80年代Smalltalk-80出现的一种软件设计模式,现在已经被广泛的使用. 1.模型(Model) 模型是应用程序的主体部分.模型表示业务数据,或者业务逻辑. 2.视图(View) 视图是应用程序中用户界面相关的部分,是用户看到并与之交互的界面. 3.控制器(controller) 控制器工作就是根据用户的输入,控制用户界面数据显示和更新model对象状态. 开发指南之MVC架构-springmvc开发指南pdf"> MVC 式的出现不仅实现了功能模块和显

Struts开发指南之工作流程

下图是Struts的工作流程,前边我们提到,所有的请求都提交给ActionServlet来处理. 开发指南之工作流程-struts开发流程">ActionServlet是一个FrontController,它是一个标准的Servlet,它将request转发给RequestProcessor来处理, ActionMapping是ActionConfig的子类,实质上是对struts-config.xml的一个映射,从中可以取得所有的配置信息 RequestProcessor根据提交过来的u

AngularJS 中的指令实践开发指南(一)_AngularJS

指令(Directives)是所有AngularJS应用最重要的部分.尽管AngularJS已经提供了非常丰富的指令,但还是经常需要创建应用特定的指令.这篇教程会为你讲述如何自定义指令,以及介绍如何在实际项目中使用.在这篇文章的最后(第二部分),我会指导你如何使用Angular指令来创建一个简单的记事本应用. 概述 一个指令用来引入新的HTML语法.指令是DOM元素上的标记,使元素拥有特定的行为.举例来说,静态的HTML不知道如何来创建和展现一个日期选择器控件.让HTML能识别这个语法,我们需要

Simple JSON开发指南_java

Simple JSON是Google开发的Java JSON解析框架,基于Apache协议. json-simple的主页:http://www.jb51.net/softs/455885.html 下载的文件是:json_simple.jar 例子1:很方便的方式,使用JSONValue System.out.println("=======decode======="); String s="[0,{\"1\":{\"2\":{\&

AngularJS中的指令实践开发指南(二)_AngularJS

在AngularJS中的指令实践指南(一)中给大家介绍了,如何隔离一个指令的scope.第二部分将承接上一篇继续介绍.首先,我们会看到在使用隔离scope的情况下,如何从指令内部访问到父scope的属性.接着,我们会基于对 controller 函数和 transclusions 讨论如何为指令选择正确的scope.这篇文章的最后会以通过一个完整的记事本应用来实践指令的使用. 隔离scope和父scope之间的数据绑定 通常,隔离指令的scope会带来很多的便利,尤其是在你要操作多个scope模