测试驱动开发(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 行为驱动开发的更多相关文章

  1. 是否使用TDD(测试驱动开发)进行UI开发

    问题 StackOverflow上有一则是否使用TDD(测试驱动开发)进行UI开发 的提问. _JacobE_问: 对于是否使用TDD进行开发UI这件事,我想了很久,但难以决定.我想听听你们的意见. ...

  2. 测试驱动开发与Python

    最近在看一本书<Test-Driven Development with Python>,里面非常详细的介绍了如何一步一步通过测试驱动开发(TDD)的方式开发Web项目.刚好这本书中使用了 ...

  3. CoreCRM 开发实录 —— 单元测试、测试驱动开发和在线服务

    测试不是问题,问题是怎么测试. ## 单元测试 我认为单元测试已经是无可争议的最佳开发实践之一.但是很多人并不同意这个观点.他们的说法无非是:写测试需要花很多时间,需求又经常变动,一但变动,一大片测试 ...

  4. 敏捷开发 —— TDD(测试驱动开发)

    测试驱动开发 TDD(Test-Driven Development)是敏捷开发的一项核心实践,同时也是一种设计技术和方法. 既然是测试驱动,便是测试,测试用例先行: 首先编写好测试用例,期待值,实际 ...

  5. 使用IdleTest进行TDD单元测试驱动开发演练(2)

    [前言] 1. 有关上篇请参见<使用IdleTest进行TDD单元测试驱动开发演练(1)>,有关本篇用到Entity Framework Code First请参见<使用NuGet助 ...

  6. TDD测试驱动开发

    TDD测试驱动开发 一.概念 TDD故名思意就是用测试的方法驱动开发,简单说就是先写测试代码,再写开发代码.传统的方式是先写代码,再测试,它的开发方式与之正好相反. TDD是极限编程的一个最重要的设计 ...

  7. 测试驱动开发(TDD)的思考

    极限编程 敏捷开发是一种思想,极限编程也是一种思想,它与敏捷开发某些目标是一致的.只是实现方式不同.测试驱动开发是极限编程的一部分. 1.极限编程这个思路的来源 Kent Beck先生最早在其极限编程 ...

  8. 原创翻译-测试驱动开发(TDD)

    测试驱动开发原则 翻译自<<Expert Python Programming>> 测试驱动开发是指首先编写包含所有测试软件特点的测试集,然后再去开发软件.也就是说,在编写软件 ...

  9. Scrum敏捷软件开发之技术实践——测试驱动开发TDD

    重复无聊的定义 测试驱动开发,英文全称Test-Driven Development,简称TDD,是一种不同于传统软件开发流程的新型的开发方法.它要求在编写某个功能的代码之前先编写测试代码,然后只编写 ...

随机推荐

  1. 【洛谷】P1196 银河英雄传说(并查集)

    题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶 ...

  2. Novell云计算

    老牌操作系统NetWare,淡出人们的视野,已记不清是哪一年的事了.不过,它的拥有者-NOVELL公司,却没有像自己曾经红极一时的OS那样被人遗忘.相反,在今天云计算的大潮中,Novell华丽转身,摇 ...

  3. 我的Linux之路——windows10用WMware安装CentOS6.9 虚拟机详细步骤

    出自:http://blog.51cto.com/13438667/2059926 一.安装环境 windows10操作系统物理机VMware Workstation 软件(可以在网上下载)CentO ...

  4. C语言清空输入缓冲区的N种方法对比(转)

    C语言中有几个基本输入函数: //获取字符系列 int fgetc(FILE *stream); int getc(FILE *stream); int getchar(void); //获取行系列 ...

  5. C++STL:流迭代器

    流迭代器是一种迭代器适配器.istream_iterator用于读取输入流,ostream_iterator用于写输出流.这些迭代器将它们所对应的流视为特定类型的元素序列.使用流迭代器时,可以用泛型算 ...

  6. Python进程监控-MyProcMonitor

    psutil api文档: http://pythonhosted.org/psutil/ api 测试 #! /usr/bin/env python # coding=utf-8 import ps ...

  7. hibernate 错误 could not determine type for

    今天配置实体类注解时,出现以下错误: org.hibernate.MappingException: Could not determine type for: com.oneToOne.IdCard ...

  8. Excel另存为_有些Excel打开时会出现一些提示

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  9. kubernetes ServiceAccount

    api server 启动参数增加 –admission_control=…,ServiceAccount,…

  10. 【LA3211 训练指南】飞机调度 【2-sat】

    题意 有n嫁飞机需要着陆.每架飞机都可以选择“早着陆”和“晚着陆”两种方式之一,且必须选择一种.第i架飞机的早着陆时间为Ei,晚着陆时间为Li,不得在其他时间着陆.你的任务是为这些飞机安排着陆方式,使 ...