BDD脱胎于TDD

行为驱动开发(Behavior-Driven Development,简称BDD),是在测试驱动开发(Test-Driven Development,TDD)基础上发展而来的一种软件开发方法。TDD最大的弊端,是面对一大堆的功能需求和用例时,往往会感到无从下手。另一方面,由于TDD更侧重于测试本身,因此容易忽视对业务需求的表达,最终沉溺于琐碎细节而无法自拔。

BDD避免了信息丢失

与传统的软件开发方法相比,BDD的本质在于尽可能避免在需求描述、用例撰写、代码实现、测试等各环节衔接、转译过程中发生的信息丢失。为此,BDD以用例Use Case和示例Example为核心,借助Gherkin等一些特有概念和一系列BDD特有工具,以更贴近业务场景的方式,实现软件需求的完整实现。二者的比较如下图所示。

传统软件开发

BDD开发

BDD流程

BDD的每个迭代可以表述为:

  • 规划整个系统,得到抽象的业务目标Business Goal
  • 将业务目标细化为若干个具体的功能需求Feature
  • 采取Given-When-Then三段式编写Gherkin,用具体的场景示例Example描述和演示特定的功能
  • 将Example转换为可执行的Specification
  • 将Specification再拆解为更低层次的、逼近代码实现的Low-Level Specification与测试Test
  • 从Low-Level Specification中得到代码实现,并析取活动文档Living Documentation

发掘Business Goal与Feature

采用Why-Who-How-What四步法发掘Business Goal

  • Why:出于何种原因要开发此系统?
  • Who:谁将从系统中受益?谁是系统的用户?谁会影响系统的开发?
  • How:怎样才能更便捷、更容易地达成业务目标?
  • What:系统能做哪些工作来实现业务目标?

而在从Business Goal发现Feature时,则采用了Why-Who-What-How四步法进行Feature的粒度细分,得到最终的用户故事。

其中,Capability是“用户需要能做什么”,而Feature是“软件能提供怎样的帮助”

BDD工具

在.NET平台,从Example到可执行的Specification,有SpecFlow可用;再到Low-Level Specification,有NUnit、RSpec等工具可用。

.NET平台下的BDD开发

在Visual Studio集成环境下,可以按以下步骤实施BDD。

准备工作

为Visual Studio安装SpecFlow扩展插件

安装扩展后,将可以在项目中添加用于编写Gherkin的Feature文件

为项目添加SpecFlow支持包

SpecFlow.NUnit集成了SpecFlow与NUnit,更方便我们编写相关的测试,所以选择安装它即可。如果要使用最新版本的SpecFlow与NUnit,则请分别选择安装(NUnit3.0与SpecFlow1.9.0貌似有冲突,测试无法被识别)。如果你喜欢其他的单元测试框架,请选择并安装相应类型的package。

撰写Gherkin

Gherkin,是BDD中采取特定格式、用于描述特定的Feature、形式为特定业务场景示例Example的文本。它较之需求规范Specification更具体明了,有点类似Use Case,但更具体生动,且既可用作测试脚本,又可作为归档的内容。

添加Gherkin

为项目添加新项,选择“SpecFlow Feature File”

编辑Gherkin

打开Feature文件,修改模板内容,得到具体业务需求的描述。其中Feature是功能描述(描述用的文本将自动作为SpecFlow测试的类名),Scenario是具体的业务场景(描述用的文本将自动作为SpecFlow测试名),接着是Given-When-Then的三段式Example描述(描述用的文本将自动作为SpecFlow生成的分步Step的方法名)。

生成可执行的Specification

可执行的Specification,是用来确认业务需求规范是否已被正确实现的自动化测试方法。

每一组Specification,对应Gherkin里的一个Given-When-Then的三段式场景Scenario。三段式的每一个分句,都将对应一个具体的测试方法,这被叫作分步Step。每个Step的方法骨架可借由SpecFlow等BDD工具自动生成,之后再手工修改即可。

SpecFlow+NUnit的组合,可以很容易地编写出可测试的Step,在Gherkin文本里的Given-When-Then等关键字上点击右键,选择“Generate Step Definitions”即可。在Attribute里出现的(.*)是占位符,类似正则析取参数。

在Build项目后,我们打开单元测试窗口,即可发现SpecFlow测试的踪影。由于此时每个分步Step里并没有我们实际的代码,因此我们运行测试时,会提示Step尚未被实现。

为了让SpecFlow的测试真正动起来,还需要修改Step的实现。简单演示如下:

新增Account类

namespace BDDExercise
{
public class Account
{
public decimal Balance { get; set; } public void Withdraw(decimal amount)
{
if (Balance - amount >= 0)
Balance -= amount;
} public void Deposit(decimal amount)
{
if (amount > 0)
Balance += amount;
} public Account(decimal amount)
{
if (amount > 0)
Balance = amount;
}
}
}

修改Step方法

using NUnit.Framework;
using TechTalk.SpecFlow; namespace BDDExercise
{
[Binding]
public class TransferringMoneyBetweenAccountsSteps
{
private Account _currentAccount;
private Account _savingAccount; [Given(@"my Current account has a balance of (.*)")]
public void GivenMyCurrentAccountHasABalanceOf(decimal p0)
{
_currentAccount = new Account(p0);
} [Given(@"my Savings account has a balance of (.*)")]
public void GivenMySavingsAccountHasABalanceOf(decimal p0)
{
_savingAccount = new Account(p0);
} [When(@"I transfer (.*) from my Current account to my Savings account")]
public void WhenITransferFromMyCurrentAccountToMySavingsAccount(decimal p0)
{
_currentAccount.Withdraw(p0);
_savingAccount.Deposit(p0);
} [Then(@"I should have (.*) in my Current account")]
public void ThenIShouldHaveInMyCurrentAccount(decimal p0)
{
Assert.AreEqual(_currentAccount.Balance, p0);
} [Then(@"I should have (.*) in my Savings account")]
public void ThenIShouldHaveInMySavingsAccount(decimal p0)
{
Assert.AreEqual(_savingAccount.Balance, p0);
}
}
}

运行测试

编写Low-Level Specification

如果说此前可执行的Specification还是一个Scenario的简单映射,那么这里的Low-Level Specification则可以理解为TDD里的单元测试了。这一步的工作,就是仁者见仁、智者见智了,需要根据具体的业务规则去逐个编写,并保证足够的覆盖率,以驱动整个功能的逐步实现。

Low-Level Specification与之前Specification分割得到的Then分句相比,Then里放简单的断言,再用Low-Level Specification更细粒度的单元测试来弥补Then的不足。

生成Living Documentation

归档主要还是依赖自动化的工具,比如VS自带的测试报告或者SpecLog之类更专业的工具等等。

行为驱动开发BDD概要的更多相关文章

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

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

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

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

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

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

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

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

  5. 行为驱动开发(BDD)

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

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

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

  7. 第一章 Android系统移植与驱动开发概述

    本书第一章首先简单概要地介绍了关于Android系统移植和驱动开发的相关内容. 所谓“移植”是指为特定的自己的设备,如手机定制Android的过程.自己开发一些程序(移植)装载在设备上,使得Andro ...

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

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

  9. Cucumber 行为驱动开发简介

    Cucumber 是一个能够理解用普通语言 描述的测试用例的支持行为驱动开发(BDD)的自动化测试工具,用Ruby编写,支持Java和.Net等多种开发语言. 现在看看Cucumber中用到的术语 . ...

随机推荐

  1. 一个用于实现并行执行的 Java actor 库

    即使 Java 6 和 Java 7 中引入并发性更新,Java 语言仍然无法让并行编程变得特别容易.Java 线程.synchronized 代码块.wait/notify 和java.util.c ...

  2. C#求百分比

    public string integralpercentage; integralpercentage = ((double)user.Credits / integralmax).ToString ...

  3. jenkins添加GIT repository报错

    添加了ssh互信,但一直提示如下错误. Failed to connect to repository : Command "git ls-remote -h git@git.xxx.cn: ...

  4. 什么是Zero-Copy?

    概述 考虑这样一种常用的情形:你需要将静态内容(类似图片.文件)展示给用户.那么这个情形就意味着你需要先将静态内容从磁盘中拷贝出来放到一个内存buf中,然后将这个buf通过socket传输给用户,进而 ...

  5. 超详细 Linux 下编译安装Redis 以及php配套使用

    一.Linux 下安装Redis 下载地址:http://redis.io/download,下载最新文档版本. 把鼠标移到上图的绿色框上,就会显示下图提示:(直接右键复制链接就好) 本教程使用的旧版 ...

  6. maven编译时GBK错误

    一.问题描述 今天在MyEclipse中使用Maven编译项目源代码时,结果如下了如下的错误 百思不得其解啊,Java源代码在MyEclipse中显示是没有任何错误的,可是执行"maven ...

  7. 基于 CodeIgniter 的各类开源项目大全

    名称:STBlog 介绍:STBlog 是一套由CI中国社区驱动,基于Codeigniter MVC 框架编写的多权限博客系统,轻巧/快速/安全/易拓展/界面友好是它的最大特点. 官方:http:// ...

  8. bzoj 1050: [HAOI2006]旅行comf(codevs.cn 1001 舒适的路线) 快排+并查集乱搞

    没用的话:好像很久没发博客了,主要是懒太蒟找不到水题.我绝对没弃坑...^_^ 还用些话:本文为博主原创文章,若转载请注明原网址和作者. 进入正题: 先pa网址: bzoj :http://www.l ...

  9. 一篇文章学会spark-streaming

    版权申明:转载请注明出处.文章来源:bigdataer.net 1.什么是spark-streaming? 实际生产中会有许多应用到实时处理的场景,比如:实时监测页面点击,实时监测系统异常,实时监测来 ...

  10. share point CSOM 客户端模式 创建 list

    /// <summary> /// 创建新的列表 list /// </summary> /// <param name="web"></ ...