TDD和BDD之间的主要区别是什么?

在过去的几年中,testing驱动开发一直是.NET社区的热门话题。 最近,我听到了ALT.NET社区对BDD的抱怨。 它是什么? 是什么使它不同于TDD?

我理解BDD比testing更关于规范 。 它与领域驱动的devise(你不喜欢这些* DD缩写?)。

它以一定的方式来编写用户故事,包括高级testing。 Tom ten Thij的一个例子是:

Story: User logging in As a user I want to login with my details So that I can get access to the site Scenario: User uses wrong password Given a username 'jdoe' And a password 'letmein' When the user logs in with username and password Then the login form should be shown again 

(在他的文章中,Tom接着直接在Ruby中执行这个testing规范。)

BDD的教皇是丹北 。 你会在他介绍的BDD文章中find一个很好的介绍。

你会发现这个video中的BDD和TDD的比较。 还有一个关于BDD被杰里米·D·米勒 ( Jeremy D. Miller)称为“TDD做得对”的观点

2013年3月25日更新

上面的video已经失踪了一段时间。 这是Llewellyn Falco最近的一个, BDD vs TDD(解释) 。 我觉得他的解释清楚明了。

对于我来说,BDD和TDD之间的主要区别是重点和措辞。 而言语对于沟通你的意图很重要。

TDD将重点放在testing上。 而且由于在“老瀑布世界”testing之后才出现,这种思维导致了错误的理解和行为。

BDD将注意力集中在行为和规范上,所以瀑布头脑分散注意力。 所以BDD更容易理解为devise实践而不是testing实践。

似乎有两种types的BDD。

第一个是Dan North讨论的原始风格,它导致了xBehave风格框架的创build。 对我而言,这种风格主要适用于验收testing或针对域对象的规范。

第二种风格是Dave Astels所推广的,对我来说,这是一种TDD的新forms,它具有一些重要的好处。 它侧重于行为而不是testing,还着重于小型testing类,试图达到每个规范(testing)方法基本上只有一行的地步。 这种风格适合所有级别的testing,可以使用任何现有的unit testing框架来完成,尽pipe较新的框架(xSpec风格)有助于将行为而不是testing集中在一个方面。

还有一个你可能会觉得有用的BDD组:

http://groups.google.com/group/behaviordrivendevelopment/

我对BDD方法进行了一些尝试,我的早熟结论是,BDD非常适合用例实现,但不适用于底层细节。 TDD仍然在这个水平上。

BDD也被用作通信工具。 目标是编写领域专家可以理解的可执行规范。

testing驱动开发是一种testing第一的软件开发方法,这意味着在编写将要testing的实际代码之前,它需要编写testing代码。 用Kent Beck的话说:

这里的风格是编写几行代码,然后运行一个testing,甚至更好,编写一个不会运行的testing,然后编写使其运行的代码。

现在,在弄清楚如何编写一小段代码之后,我们不是只编写代码,而是希望立即获得反馈,并练习“编写一些代码,稍微testing一下,编写一些代码,再testing一下”。 所以我们立即为它写一个testing。

所以TDD是一种低级别的技术方法,程序员可以用它来生成干净的代码。

行为驱动开发是一种基于TDD创build的方法,但演变为一个不仅仅涉及程序员和testing人员的过程,而是涉及整个团队和所有重要的利益相关者,技术和非技术。 BDD从一些简单的问题出发,TDD不能很好地回答:我应该写多lesstesting? 我应该怎样testing – 我该怎么做? 我写的哪个testing对于业务或产品的整体质量来说实际上是重要的,哪些只是我的过度工程?

正如你所看到的,这样的问题需要技术和业务之间的协作。 业务利益相关者和领域专家经常可以告诉工程师什么样的testing听起来像是有用的 – 但只有当testing是处理重要业务方面的高级testing时才是如此。 BDD把这种类似业务的testing称为“示例”,如“告诉我一个这个特性应该如何正确performance的例子”,并保留用于低级技术检查(如数据validation或testingAPI集成)的“testing”一词。 重要的部分是,虽然testing只能由程序员和testing人员创build,但是例子可以由整个交付团队 – devise人员,分析人员等来收集和分析。

在一个句子中,迄今为止我发现的BDD最好的定义之一就是BDD是关于“与领域专家进行对话并且使用示例来获得对期望的行为的共同理解并且发现未知”。发现部分是非常重要的。 随着交付团队收集更多示例,他们开始越来越多地了解业务领域,从而减less了他们必须处理的产品的某些方面的不确定性。 随着不确定性的降低,交付团队的创造力和自主性会增加。 例如,他们现在可以开始build议他们自己的例子,由于缺乏技术专业知识,商业用户不认为是可能的。

现在,与业务和领域专家交谈听起来不错,但我们都知道这往往是在实践中最终。 我开始了作为程序员的技术之旅。 作为程序员,我们被教导编写代码 –algorithm,devise模式,抽象。 或者,如果你是一个devise师,你将被教授devise –组织信息并创build漂亮的界面。 但是,当我们获得入门级的工作时,我们的雇主希望我们“为客户提供价值”。 而在这些客户当中,例如银行。 但是,除了如何有效地减less我的账户余额,我几乎可以知道银行业务。 所以我必须以某种方式将我期望的代码翻译成代码……如果我想提供任何价值,我将不得不在银行与我的技术专长之间架起一座桥梁。 BDD帮助我在交付团队和领域专家之间的stream畅沟通的稳定基础上build立起这样一座桥梁。

学到更多

如果你想了解更多关于BDD的信息,我就写了一本关于这个主题的书。 “写出重要规格”探索分析需求的艺术,将帮助您学习如何build立一个伟大的BDDstream程,并将示例作为该stream程的核心部分。 本书讲述无处不在的语言,收集实例,并从实例中创build所谓的可执行规范(自动化testing) – 帮助BDD团队按时和按预算交付出色软件的技术。

如果您有兴趣购买“Writing Great Specifications” ,则可以使用促销代码39nicieja2 🙂 节省39%

在我看来,BDD是一个更广泛的范围。 这几乎意味着使用TDD,BDD是收集信息和使用TDD实践以确保快速反馈的信息和要求的综合方法。

BDD与TDD相比,我有了最新的知识,BDD专注于指定接下来会发生什么,而TDD专注于设置一组条件,然后查看输出。

BDD在很大程度上是TDD完成的。 但是,BDD提供了额外的价值。 这里有一个链接:

BDD不仅仅是“TDD正确”

行为驱动开发似乎更注重开发人员之间以及开发人员和testing人员之间的交互和沟通。

维基百科文章有一个解释:

行为驱动的发展

不是自己练习BDD。

考虑TDD的主要优点是devise。 它应该被称为testing驱动devise。 BDD是TDD的一个子集,称之为行为驱动devise。

现在考虑一个stream行的TDD – unit testing的实现。 unit testing中的单位通常是一个逻辑单位,是您可以完成的最小工作单位。

当您将这些单元放在一起以function的方式描述机器所需的行为时,您需要了解您正在向机器描述的行为。 行为驱动devise侧重于validation实施者对用例/需求/任何的理解,并validation每个function的实现。 一般而言,BDD和TDD具有通知devise的重要目的,以及validation实现的正确性的第二个目的,尤其是当它改变时。 BDD做对了涉及biz和dev(和qa),而unit testing(可能错误地被视为TDD而不是一种types的TDD)通常在dev筒仓中完成。

我想补充一点,BDDtesting可以作为生活需求。

这里是快照:

  • TDD只是在写代码之前testing代码的过程!

  • DDD是在触摸代码的每个循环之前被通知域的过程!

  • BDD是TDD的一个实现,它引入了DDD的一些方面!

希望有所帮助!

testing驱动开发(TDD)和行为驱动开发(BDD)之间的区别

  • BDD侧重于系统的行为方面,而不是
    TDD所关注的系统的实现方面。

  • BDD更清楚地了解系统应该做什么
    从开发人员和客户的angular度来看。 只有TDD
    让开发人员了解系统应该做什么。

  • BDD允许开发人员和客户一起工作,以进行系统源代码中包含的需求分析。

TDD和BDD没有区别。 除非您可以更好地阅读您的testing,并且可以将它们用作要求。 如果您在编写BDDtesting时使用相同的词语编写需求,那么您可以使用定义好的一些testing来编写代码。

TDD和BDD之间的select是一个复杂的select。 这取决于你的目标语言是否有适当的testing框架,你的同事是否适应,有时还有其他因素。

有人认为,BDD总是比TDD更好,因为它有可能消除使用TDD时可能出现的问题。

BDD的关键是可以防止问题; 这是不能保证的。 糟糕的代码组织,糟糕的devise实践等问题仍将持续存在。 你只会有一个较差的写testing的可能性,因此具有更强大的function。

这个博客提供了一个TDD,BDD和ATDD之间差异的有趣观点: http : //assertselenium.com/2012/11/05/difference-between-tdd-bdd-atdd/