在过去的几年中,测试驱动开发一直是.NET社区中的热门话题。最近,我在ALT.NET社区中听到有关BDD的抱怨。它是什么?与TDD有何不同?
在过去的几年中,测试驱动开发一直是.NET社区中的热门话题。最近,我在ALT.NET社区中听到有关BDD的抱怨。它是什么?与TDD有何不同?
Answers:
我了解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(解释)。我认为他的解释清楚明确。
BDD似乎有两种类型。
第一个是Dan North讨论的原始样式,它导致了xBehave样式框架的创建。对我来说,这种样式主要适用于针对领域对象的验收测试或规范。
第二种风格是Dave Astels所流行的,对我来说,这是TDD的一种新形式,它具有一定的优势。它着重于行为而不是测试以及小型测试类,以期使每个规范(测试)方法基本上只有一行。这种样式适合所有级别的测试,并且可以使用任何现有的单元测试框架来完成,尽管较新的框架(xSpec样式)帮助将行为集中于行为而不是测试。
还有一个BDD组,您可能会发现它有用:
测试驱动开发是一种测试优先的软件开发方法,这意味着它需要先编写测试代码,然后再编写将要测试的实际代码。用肯特·贝克的话来说:
这里的风格是编写几行代码,然后编写应该运行的测试,或者甚至更好的做法是编写将无法运行的测试,然后编写将使其运行的代码。
在弄清楚如何编写一小段代码之后,现在,我们不仅要进行编码,还希望获得即时反馈并练习“一点点编写代码,一点点测试,一点点代码,一点点测试”。因此,我们立即为其编写了一个测试。
因此,TDD是程序员用来产生有效代码的低级技术方法。
行为驱动开发是一种基于TDD创建的方法,但后来演变为一个过程,该过程不仅涉及程序员和测试人员,而且涉及整个团队以及所有重要的技术和非技术利益相关者。BDD从TDD不能很好回答的几个简单问题开始:我应该编写多少测试?我应该实际测试什么?我不应该测试什么?实际上,我编写的哪些测试对业务或产品的整体质量很重要,而哪些只是我的过度设计?
如您所见,此类问题需要技术与业务之间的协作。业务利益相关者和领域专家通常可以告诉工程师什么样的测试听起来很有用,但前提是这些测试是涉及重要业务方面的高级测试。BDD称这类类似业务的测试为“示例”,如“告诉我此功能应如何正确运行的示例”,并为诸如数据验证或测试API集成之类的低级技术检查保留了“测试”一词。重要的是,尽管测试只能由程序员和测试人员创建,但是示例可以由整个交付团队(由设计师,分析师等)收集和分析。
一句话,到目前为止,我发现的BDD的最佳定义之一是BDD的意思是“与领域专家进行对话,并使用示例来获得对所需行为的共同理解并发现未知数。” 发现部分非常重要。随着交付团队收集更多示例,他们开始越来越了解业务领域,因此他们减少了对他们必须处理的产品某些方面的不确定性。随着不确定性的降低,交付团队的创造力和自主权也会增加。例如,他们现在可以开始建议自己的示例,这些示例由于缺乏专业技术知识而使业务用户认为不可能。
现在,与业务和领域专家进行对话听起来很不错,但是我们都知道在实践中通常会如此。我以程序员的身份开始了技术之旅。作为程序员,我们被教导编写代码-算法,设计模式,抽象。或者,如果您是设计师,就会被教导设计-组织信息并创建漂亮的界面。但是,当我们获得入门级工作时,我们的雇主期望我们“为客户创造价值”。在这些客户中,例如可以是……一家银行。但是我几乎对银行一无所知-除了如何有效地减少我的帐户余额。因此,我必须以某种方式将对我的期望转换为代码...如果我想提供任何价值,就必须在银行业和我的技术专长之间架起一座桥梁。BDD帮助我在交付团队和领域专家之间的稳定沟通的稳定基础上架起了一座桥梁。
学到更多
如果您想了解有关BDD的更多信息,我写了一本书。“撰写出色的规范”探讨了分析需求的技巧,将帮助您学习如何构建出色的BDD流程并将示例用作该流程的核心部分。本书讨论了无处不在的语言,收集了示例,并从示例中创建了所谓的可执行规范(自动测试),这些技术可帮助BDD团队按时,按预算提供出色的软件。
如果您有兴趣购买“书写规范” ,可以使用促销代码39nicieja2 节省39%:)
考虑将TDD的主要好处是设计。它应该称为测试驱动设计。BDD是TDD的子集,称为行为驱动设计。
现在考虑一种流行的TDD实现-单元测试。单元测试中的单元通常是逻辑的一点,这是您可以做的最小工作单元。
当您以功能性方式将这些单元组合在一起以描述机器所需的行为时,您需要了解要描述的机器行为。行为驱动设计的重点是验证实施者对用例/需求/任何事物的理解,并验证每个功能的实现。通常,BDD和TDD的主要目的是通知设计,第二个目的是检验实现的正确性,尤其是在更改时。正确的BDD涉及biz和dev(以及qa),而单元测试(可能被错误地视为TDD而非一种TDD类型)通常是在dev筒仓中完成的。
我还要补充一点,BDD测试可以满足生活要求。
BDD在很大程度上是TDD正确完成的。但是,BDD提供了额外的价值。这是一个链接:
这是快速快照:
TDD只是在编写代码之前测试代码的过程!
DDD是在每个接触代码周期之前被告知域的过程!
BDD是TDD的实现,它引入了DDD的某些方面!