TDD,BDD,DDD 三者的区别

TDD

测试驱动开发(英语:Test-driven development,缩写为TDD)是一种软件开发过程中的应用方法,由极限编程中倡导,以其倡导先写测试程序,
然后编码实现其功能得名。

测试驱动开发始于20世纪90年代。测试驱动开发的目的是取得快速反馈并使用“illustrate the main line”方法来构建程序。

测试驱动开发是戴两顶帽子思考的开发方式:先戴上实现功能的帽子,在测试的辅助下,快速实现其功能;再戴上重构的帽子,在测试的保护下,通过去除冗余的代码,提高代码质量。测试驱动着整个开发过程:首先,驱动代码的设计和功能的实现;其后,驱动代码的再设计和重构。

实践

  • 优点
  1. 可以有效的避免过度设计带来的浪费。但是也有人强调在开发前需要有完整的设计再实施可以有效的避免重构带来的浪费。
  2. 可以让开发者在开发中拥有更全面的视角。
  • 缺点
  1. 开发者可能只完成满足了测试的代码,而忽略了对实际需求的实现。有实践者认为用结对编程的方式可以有效的避免这个问题。

  2. 会放慢开发实际代码的速度,特别对于要求开发速度的原型开发造成不利。这里需要考虑开发速度需要包含功能和品质两个方面,单纯的代码速度可能不能完全代表开发速度。

  3. 对于GUI,资料库和Web应用而言。构造单元测试比较困难,如果强行构造单元测试,反而给维护带来额外的工作量。有开发者认为这个是由于设计方法,而不是开发方法造成的困难。

  4. 使得开发更为关注用例和测试案例,而不是设计本身。目前,对于这个观点有较多的争议。

  5. 测试驱动开发会导致单元测试的覆盖度不够,比如可能缺乏边界测试。在实际的操作中,和非测试驱动开发一样,当代码完成以后还是需要补充单元测试,提高测试的覆盖度。

BDD

行为驱动开发(英语:Behavior-driven development,缩写BDD)是一种敏捷软件开发的技术,它鼓励软件项目中的开发者、
QA和非技术人员或商业参与者之间的协作。

BDD的重点是通过与利益相关者的讨论取得对预期的软件行为的清醒认识。它通过用自然语言书写非程序员可读的测试用例扩展了测试驱动开发方法。

行为驱动开发人员使用混合了领域中统一的语言的母语语言来描述他们的代码的目的。这让开发者得以把精力集中在代码应该怎么写,而不是技术细节上,
而且也最大程度的减少了将代码编写者的技术语言与商业客户、用户、利益相关者、项目管理者等的领域语言之间来回翻译的代价。

实践

  1. 确立不同利益相关者要实现的远景目标
  2. 使用特性注入方法绘制出达到这些目标所需要的特性
  3. 通过由外及内的软件开发方法,把涉及到的利益相关者融入到实现的过程中
  4. 使用例子来描述应用程序的行为或代码的每个单元
  5. 通过自动运行这些例子,提供快速反馈,进行回归测试
  6. 使用“应当(should)”来描述软件的行为,以帮助阐明代码的职责,以及回答对该软件的功能性的质疑
  7. 使用“确保(ensure)”来描述软件的职责,以把代码本身的效用与其他单元(element)代码带来的边际效用中区分出来。
  8. 使用mock作为还未编写的相关代码模块的替身

DDD

领域模型(或称域模型;英语:domain model)可以被看作是一个系统的概念模型,用于以可视化的形式描述系统中的各个实体及其之间的关系。
领域模型记录了一个系统中的关键概念和词汇表,显示出了系统中的主要实体之间的关系,并确定了它们的重要的方法和属性。因此,对应于用例所
描述的动态视图,领域模型提供了一种对整个系统的结构化的视图。领域模型的一个好处是描述并限制了系统边界。

领域模型的语义可以被用在源代码中,因此领域模型可以被应用在底层的软件开发阶段中。实体可以演化为类,方法和属性可以直接演化至代码之中。
在UML中,类图被用来描述领域模型。