Unit testing TDD和BDD的主要区别是什么?

Unit testing TDD和BDD的主要区别是什么?,unit-testing,tdd,bdd,Unit Testing,Tdd,Bdd,在过去的几年里,测试驱动的开发在.NET社区中风靡一时。最近,我在ALT.NET社区听到了关于BDD的抱怨。这是怎么一回事?是什么使它不同于TDD?行为驱动开发似乎更关注开发人员之间以及开发人员和测试人员之间的交互和沟通 维基百科的文章有一个解释: 不过我自己并没有练习BDD。在我看来,BDD的范围更广。这几乎意味着使用了TDD,BDD是一种比较方法,它收集信息和要求,用于使用TDD实践,以及其他东西,以确保快速反馈。我理解BDD更多地是关于规范而不是测试。它与领域驱动设计相关联(难道你不喜欢

在过去的几年里,测试驱动的开发在.NET社区中风靡一时。最近,我在ALT.NET社区听到了关于BDD的抱怨。这是怎么一回事?是什么使它不同于TDD?

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

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


不过我自己并没有练习BDD。

在我看来,BDD的范围更广。这几乎意味着使用了TDD,BDD是一种比较方法,它收集信息和要求,用于使用TDD实践,以及其他东西,以确保快速反馈。

我理解BDD更多地是关于规范而不是测试。它与领域驱动设计相关联(难道你不喜欢这些*DD首字母缩略词吗?)

它与编写用户故事的特定方式相关联,包括高级测试。例如:

(在他的文章中,Tom继续用Ruby直接执行这个测试规范。)

BDD的教皇是。你会在他的文章中找到一个很好的介绍

您将在本文中找到BDD和TDD的比较。还有一种观点认为BDD是“TDD做得对的”

2013年3月25日更新


上面的视频已经丢失了一段时间。这是卢埃林·法尔科最近的作品。我发现他的解释很清楚,而且切中要害。

我对BDD方法做了一些试验,我过早的结论是BDD非常适合用例实现,但不适合底层细节。TDD仍然在这个水平上摇摆


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

对我来说,BDD和TDD的主要区别在于重点和措辞。语言对于传达你的意图很重要

TDD将重点放在测试上。因为在“旧瀑布世界”中,测试是在实现之后进行的,所以这种心态会导致错误的理解和行为


BDD将注意力集中在行为和规范上,因此瀑布式思维会分散注意力。因此,BDD更容易理解为设计实践,而不是测试实践。

BDD似乎有两种类型

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

第二种风格是Dave Astels推广的,对我来说,这是TDD的一种新形式,有一些严重的好处。它关注的是行为而不是测试,也关注小的测试类,试图达到基本上每个规范(测试)方法只有一行的程度。这种风格适合所有级别的测试,可以使用任何现有的单元测试框架来完成,尽管较新的框架(xSpec风格)有助于关注行为而不是测试

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


根据我对BDD的最新了解,与TDD相比,BDD侧重于指定接下来会发生什么,而TDD侧重于设置一组条件,然后查看输出。

TDD和BDD之间没有区别。除了你可以更好地阅读你的测试,你可以把它们作为需求使用。如果您使用与编写BDD测试相同的词语编写需求,那么您可以从客户那里获得一些定义好的测试,以便编写代码。

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

现在考虑TDD单元测试的流行实现。单元测试中的单元通常是一个逻辑位,它是您可以完成的最小工作单元

当您以功能性的方式将这些单元组合在一起以向机器描述所需的行为时,您需要理解您向机器描述的行为。行为驱动设计侧重于验证实现者对用例/需求/任何东西的理解,并验证每个特性的实现。BDD和TDD通常用于通知设计的重要目的,第二个目的是验证实现的正确性,尤其是当它发生变化时。正确完成BDD涉及biz和开发(以及qa),而单元测试(可能被错误地视为TDD而不是一种TDD)通常在开发竖井中完成


我想补充一点,BDD测试作为生活需求。

以下是快速快照:

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

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

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


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

这里的风格是写几行代码,然后测试 应该运行,或者更好,编写一个不会运行的测试,然后编写 使其运行的代码

在弄清楚如何编写一小段代码之后,现在,我们不只是继续编写代码,而是希望获得即时反馈,并练习“编写一点代码,测试一点,编写一点代码,测试一点”。因此,我们立即为它编写一个测试

因此,TDD是一种低级的技术方法,程序员使用它来生成干净的代码

行为驱动开发是一种基于TDD创建的方法,但它已发展成为一个不仅涉及程序员和测试人员,而且涉及整个团队的过程
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