测试驱动开发 VS 行为驱动开发
测试驱动开发(Test Driven Development,英文缩写TDD)是极限编程的一个重要组成部分,它的基本思想就是在开发功能代码之前,先编写测试代码。也就是说在明确要开发某个功能后,首先思考如何对这个功能进行测试,并完成测试代码的编写,然后编写相关的代码满足这些测试用例。然后循环进行添加其他功能,直到完成全部功能的开发。代码整洁可用(clean code that works) 是测试驱动开发所追求的目的
优点
测试驱动开发有很多优点:
(1)完工时完工。表明开发人员可以很清楚的看到自己的这段工作已经结束了,而传统的方式很难知道什么时候编码工作结束了。
(2)全面正确的认识代码和利用代码,而传统的方式没有这个机会。
(3)开发小组间降低了交流成本,提高了相互信赖程度。
(4)避免了过渡设计。
(5)系统可以与详尽的测试集一起发布,从而对程序的将来版本的修改和扩展提供方便。
(6)逃避了设计角色。对于一个敏捷的开发小组,每个人都在做设计。
(7)大部分时间代码处在高质量状态,100%的时间里成果是可见的。
(8)由于可以保证编写测试和编写代码的是相同的程序员,降低了理解代码所花费的成本。
(9)为减少文档和代码之间存在的细微的差别和由这种差别所引入的Bug作出杰出贡献。
(10)在预先设计和紧急设计之间建立一种平衡点,区分哪些设计该事先做、哪些设计该迭代时做提供了一个可靠的判断依据。
(12)发现比传统测试方式更多的Bug。
开发过程
概括起来,测试驱动开发的基本过程如下:
(1) 明确当前要完成的功能。可以记录成一个 TODO 列表。
(2) 快速完成针对此功能的测试用例编写。
(3) 测试代码编译不通过。
(4) 编写对应的功能代码。
(5) 测试通过。
(6) 对代码进行重构,并保证测试通过。
(7) 循环完成所有功能的开发。
行为驱动开发(Behavior-Driven Development)(简写BDD)
BDD 作为一种设计方法,可以有效的改善设计,并在系统的演化过程中为团队指明前进方向。
行为驱动开发的根基是一种“通用语言”。这种通用语言同时被客户和开发者用来定义系统的行为。由于客户和开发者使用同一种“语言”来描述同一个系统,可以最大程度避免表达不一致带来的问题。表达不一致是软件开发中最常见的问题,由此造成的结果就是开发人员最终做出来的东西就不是客户期望的。使用通用语言,客户和开发者可以一起定义出系统的行为,从而做出符合客户需求的设计。但如果光有设计,而没有验证的手段,就无法检验我们的实现是不是符合设计。所以 BDD 还是要和测试结合在一起,用系统行为的定义来验证实现代码。
行为驱动开发是测试驱动开发的进化,但关注的核心是设计。行为驱动开发中,定义系统的行为是主要工作,而对系统行为的描述则变成了测试标准。在行为驱动开发中,我们需要使用通用语言来定义系统行为。而通用语言,实际上是一个最小化的词汇表。我们使用这些词汇来书写故事。选入词汇表的词汇必须具有准确无误的表达能力和一致的含义。例如“系统”这个词就不符合要求,因为在不同的语境(又称为上下文 Context)中,“系统”一词具有不同的含义。而“自动提款机”则明确标识了一个没有歧义的事物。
书写格式:
Story: 标题 (描述故事的单行文字)
As a [角色]
I want [特征]
So that [利益]
(用一系列的场景来定义验证标准)
Scenario 1: 标题 (描述场景的单行文字)
Given [上下文]
And [更多的上下文]...
When [事件]
Then [结果]
And [其他结果]...
实例:
Story: 帐户持有人提取现金
As an [帐户持有人]
I want [从 ATM 提取现金]
So that [可以在银行关门后取到钱]
Scenario 1: 帐户有足够的资金
Given [帐户余额为 $100]
And [有效的银行卡]
And [提款机有足够现金]
When [帐户持有人要求取款 $20]
Then [提款机应该分发 $20]
And [帐户余额应该为 $80]
And [应该退还银行卡]
测试驱动开发 VS 行为驱动开发的更多相关文章
- 是否使用TDD(测试驱动开发)进行UI开发
问题 StackOverflow上有一则是否使用TDD(测试驱动开发)进行UI开发 的提问. _JacobE_问: 对于是否使用TDD进行开发UI这件事,我想了很久,但难以决定.我想听听你们的意见. ...
- 测试驱动开发与Python
最近在看一本书<Test-Driven Development with Python>,里面非常详细的介绍了如何一步一步通过测试驱动开发(TDD)的方式开发Web项目.刚好这本书中使用了 ...
- CoreCRM 开发实录 —— 单元测试、测试驱动开发和在线服务
测试不是问题,问题是怎么测试. ## 单元测试 我认为单元测试已经是无可争议的最佳开发实践之一.但是很多人并不同意这个观点.他们的说法无非是:写测试需要花很多时间,需求又经常变动,一但变动,一大片测试 ...
- 敏捷开发 —— TDD(测试驱动开发)
测试驱动开发 TDD(Test-Driven Development)是敏捷开发的一项核心实践,同时也是一种设计技术和方法. 既然是测试驱动,便是测试,测试用例先行: 首先编写好测试用例,期待值,实际 ...
- 使用IdleTest进行TDD单元测试驱动开发演练(2)
[前言] 1. 有关上篇请参见<使用IdleTest进行TDD单元测试驱动开发演练(1)>,有关本篇用到Entity Framework Code First请参见<使用NuGet助 ...
- TDD测试驱动开发
TDD测试驱动开发 一.概念 TDD故名思意就是用测试的方法驱动开发,简单说就是先写测试代码,再写开发代码.传统的方式是先写代码,再测试,它的开发方式与之正好相反. TDD是极限编程的一个最重要的设计 ...
- 测试驱动开发(TDD)的思考
极限编程 敏捷开发是一种思想,极限编程也是一种思想,它与敏捷开发某些目标是一致的.只是实现方式不同.测试驱动开发是极限编程的一部分. 1.极限编程这个思路的来源 Kent Beck先生最早在其极限编程 ...
- 原创翻译-测试驱动开发(TDD)
测试驱动开发原则 翻译自<<Expert Python Programming>> 测试驱动开发是指首先编写包含所有测试软件特点的测试集,然后再去开发软件.也就是说,在编写软件 ...
- Scrum敏捷软件开发之技术实践——测试驱动开发TDD
重复无聊的定义 测试驱动开发,英文全称Test-Driven Development,简称TDD,是一种不同于传统软件开发流程的新型的开发方法.它要求在编写某个功能的代码之前先编写测试代码,然后只编写 ...
随机推荐
- Web App、Hybrid App与Native App的设计差异
目前主流应用程序大体分为三类:Web App.Hybrid App. Native App. 一.Web App.Hybrid App.Native App 纵向对比 首先,我们来看看什么是 Web ...
- java并发的基本概念和级别
并发的概念: 并发(Concurrency)和并行(Parallelism) 并发偏重于多个任务交替执行,而多个任务之间有可能还是串行的.而并行是真正意义上的“同时执行”.严格意义上来说,并行的多个任 ...
- 怎么分辨linux系统是虚拟机还是物理机
用lspci -b|grep "VMware"抓取系列信息,即表明此系统的宿主机是基于VMware虚拟出来的,别的可以照葫芦画瓢来!
- centos7.3查看时区
[root@iZ2ze3gf6h0zndx5dxyhqiZ ~]# date -R Fri, Apr :: + 即可查看时区 我们国家的东八区(+0800) 查看clock系统配置文件 [root@i ...
- Python 小知识点(9)--反射
通过字符串映射或修改程序运行时的状态.属性.方法.有如下四个方法 1.hasattr(obj,name_str) , 判断一个对象obj里是否有对应的name_str字符串的方法 2.getattr( ...
- mongodb主从复制 副本集(六)
主从复制副本集 8888.conf dbpath = D:\software\MongoDBDATA\07\8888 #主数据库地址port = 8888 #主数据库端口号bind_ip = 127. ...
- 表单验证常用的JS正则表达式
在表单验证中,使用正则表达式来验证正确与否是一个很频繁的操作,本文收集整理了15个常用的javaScript正则表达式,其中包括用户名.密码强度.整数.数字.电子邮件地址(Email).手机号码.身份 ...
- Git(一):Eclipse中配置Git
在Eclipse中配置Git: 一,由于我使用的是新版本的eclipse j2ee 4.4默认集成git,所以不用手动安装git插件 二,Eclipse配置基础信息.Windows->Prefe ...
- tomcat的中的Apache的apr是个啥东东???
这东西的作用说白了就是让我们的项目在其他系统中也可以正常运行!!!!
- DAVINCI开发原理
本文中约定: [host] 表示主机PC机Linux [target] 表示目标板Linux DAVINCI开发原理之一----ARM端开发环境的建立(DVEVM) 1. 对DAVINCI平台,TI在 ...