TDD和BDD之间的主要区别是什么?[关闭]


129

在过去的几年中,测试驱动开发一直是.NET社区中的热门话题。最近,我在ALT.NET社区中听到有关BDD的抱怨。它是什么?与TDD有何不同?


2
另请参阅developers.stackexchange.com/q/135218/76176。这个问题更多关于那里的话题。
埃文·卡洛尔

TDD用于微测试。BDD用于需求或宏测试。听有关测试金字塔的第1集到第8集,它将解释这些级别:agilenoir.biz/series/agile-thoughts
Lance Kind

Answers:


104

我了解BDD的重点是规范,而不是测试。它与域驱动设计链接(您不喜欢这些* DD首字母缩写词吗?)。

它与编写用户案例的特定方式(包括高级测试)相关联。汤姆·十·蒂杰Tom十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中直接执行此测试规范。)

BDD的教皇是Dan North。您将在他的BDD简介文章中找到很好的介绍。

您将在此视频中找到BDD和TDD的比较。杰里米·米勒Jeremy D. Miller)也认为BDD是“正确的TDD”

2013年3月25日更新

上面的视频已经消失了一段时间。这是Llewellyn Falco最近发表的一篇文章,BDD vs TDD(解释)。我认为他的解释清楚明确。


10
视频链接似乎已经变糟
James Nail

1
克里斯汀,视频标题和演讲者名字是什么?因此我们可以对其进行跟踪
-smci 2012年

1
“ Tom Ten Thij”上方的链接现已死亡..这是现场@ -tomtenthij.nl
Kundan Pandit

以下是一个简短的游戏,介绍了BDD的要点:agilenoir.biz/zh/am-i-behavioral-or-not
Lance Kind

16

对我而言,BDD和TDD之间的主要区别在于重点和措辞。言语对于传达您的意图很重要。

TDD将重点放在测试上。而且由于在“旧瀑布世界”中进行测试是在实施之后进行的,因此这种思维方式会导致错误的理解和行为。

BDD专注于行为和规范,因此瀑布般的思维分散了注意力。因此,BDD更容易理解为设计实践而不是测试实践。


2
TDD与“瀑布”软件设计生命周期无关。如果有的话,TDD与SDLC无关。TDD的目的是编写通过测试所需的最少代码量。在某种程度上,测试成为要遵守的代码的技术规范。
加文·鲍马尼斯

1
TDD是“测试先行”,可以与敏捷一起很好地工作。这是不正确的。
Terrance

13

BDD似乎有两种类型。

第一个是Dan North讨论的原始样式,它导致了xBehave样式框架的创建。对我来说,这种样式主要适用于针对领域对象的验收测试或规范。

第二种风格是Dave Astels所流行的,对我来说,这是TDD的一种新形式,它具有一定的优势。它着重于行为而不是测试以及小型测试类,以期使每个规范(测试)方法基本上只有一行。这种样式适合所有级别的测试,并且可以使用任何现有的单元测试框架来完成,尽管较新的框架(xSpec样式)帮助将行为集中于行为而不是测试。

还有一个BDD组,您可能会发现它有用:

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


7

测试驱动开发是一种测试优先的软件开发方法,这意味着它需要先编写测试代码,然后再编写将要测试的实际代码。用肯特·贝克的话来说:

这里的风格是编写几行代码,然后编写应该运行的测试,或者甚至更好的做法是编写将无法运行的测试,然后编写将使其运行的代码。

在弄清楚如何编写一小段代码之后,现在,我们不仅要进行编码,还希望获得即时反馈并练习“一点点编写代码,一点点测试,一点点代码,一点点测试”。因此,我们立即为其编写了一个测试。

因此,TDD是程序员用来产生有效代码的低级技术方法。

行为驱动开发是一种基于TDD创建的方法,但后来演变为一个过程,该过程不仅涉及程序员和测试人员,而且涉及整个团队以及所有重要的技术和非技术利益相关者。BDD从TDD不能很好回答的几个简单问题开始:我应该编写多少测试?我应该实际测试什么?我不应该测试什么?实际上,我编写的哪些测试对业务或产品的整体质量很重要,而哪些只是我的过度设计?

如您所见,此类问题需要技术与业务之间的协作。业务利益相关者和领域专家通常可以告诉工程师什么样的测试听起来很有用,但前提是这些测试是涉及重要业务方面的高级测试。BDD称这类类似业务的测试为“示例”,如“告诉我此功能应如何正确运行的示例”,并为诸如数据验证或测试API集成之类的低级技术检查保留了“测试”一词。重要的是,尽管测试只能由程序员和测试人员创建,但是示例可以由整个交付团队(由设计师,分析师等)收集和分析。

一句话,到目前为止,我发现的BDD的最佳定义之一是BDD的意思是“与领域专家进行对话,并使用示例来获得对所需行为的共同理解并发现未知数。” 发现部分非常重要。随着交付团队收集更多示例,他们开始越来越了解业务领域,因此他们减少了对他们必须处理的产品某些方面的不确定性。随着不确定性的降低,交付团队的创造力和自主权也会增加。例如,他们现在可以开始建议自己的示例,这些示例由于缺乏专业技术知识而使业务用户认为不可能。

现在,与业务和领域专家进行对话听起来很不错,但是我们都知道在实践中通常会如此。我以程序员的身份开始了技术之旅。作为程序员,我们被教导编写代码-算法,设计模式,抽象。或者,如果您是设计师,就会被教导设计-组织信息并创建漂亮的界面。但是,当我们获得入门级工作时,我们的雇主期望我们“为客户创造价值”。在这些客户中,例如可以是……一家银行。但是我几乎对银行一无所知-除了如何有效地减少我的帐户余额。因此,我必须以某种方式将对我的期望转换为代码...如果我想提供任何价值,就必须在银行业和我的技术专长之间架起一座桥梁。BDD帮助我在交付团队和领域专家之间的稳定沟通的稳定基础上架起了一座桥梁。

学到更多

如果您想了解有关BDD的更多信息,我写了一本书。“撰写出色的规范”探讨了分析需求的技巧,将帮助您学习如何构建出色的BDD流程并将示例用作该流程的核心部分。本书讨论了无处不在的语言,收集了示例,并从示例中创建了所谓的可执行规范(自动测试),这些技术可帮助BDD团队按时,按预算提供出色的软件。

如果您有兴趣购买“书写规范” ,可以使用促销代码39nicieja2 节省39%:)


6

我已经对BDD方法进行了一些试验,但过早的结论是BDD非常适合用例实现,但不适用于底层细节。TDD仍处于这一水平。

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


2

在我看来,BDD的范围更广。这几乎意味着使用了TDD,而BDD是一种可简化的方法,它收集了信息和要求,以使用TDD做法来确保快速反馈。


2

与TDD相比,根据我在BDD中的最新知识,BDD专注于指定接下来将要发生的事情,而TDD则专注于设置一组条件,然后查看输出。


2

行为驱动开发似乎更关注开发人员之间以及开发人员和测试人员之间的交互和通信。

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

行为驱动的发展

虽然我自己没有练习BDD。


2

考虑将TDD的主要好处是设计。它应该称为测试驱动设计。BDD是TDD的子集,称为行为驱动设计。

现在考虑一种流行的TDD实现-单元测试。单元测试中的单元通常是逻辑的一点,这是您可以做的最小工作单元。

当您以功能性方式将这些单元组合在一起以描述机器所需的行为时,您需要了解要描述的机器行为。行为驱动设计的重点是验证实施者对用例/需求/任何事物的理解,并验证每个功能的实现。通常,BDD和TDD的主要目的是通知设计,第二个目的是检验实现的正确性,尤其是在更改时。正确的BDD涉及biz和dev(以及qa),而单元测试(可能被错误地视为TDD而非一种TDD类型)通常是在dev筒仓中完成的。

我还要补充一点,BDD测试可以满足生活要求。



1

TDD和BDD之间没有区别。除了可以更好地阅读测试,而且可以将其用作要求。如果用与编写BDD测试相同的词来编写需求,那么您可以来自客户,定义了一些准备编写代码的测试。


1

测试驱动开发(TDD)与行为驱动开发(BDD)之间的区别

  • BDD专注于系统的行为方面,而不是
    TDD专注于系统的实现方面。

  • BDD
    从开发人员和客户的角度更清楚地了解系统应该做什么。TDD仅
    使开发人员了解系统应该做什么。

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


1

简而言之,TDD和BDD之间存在主要区别。在TDD中,我们主要关注测试数据。在BDD中,我们主要关注项目的行为,以便任何非编程人员都可以代表标题理解代码行。那方法


1

这是快速快照:

  • TDD只是在编写代码之前测试代码的过程!

  • DDD是在每个接触代码周期之前被告知域的过程!

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.