老实说,我没有看到BDD和TDD之间的区别。我的意思是,两者都只是测试预期会发生什么。我已经看到BDD测试如此充实,它们实际上被视为TDD测试,我看到TDD测试非常模糊,以至于他们黑了很多代码。让我们说我相信两者都更好。
这是一个有趣的问题。我从哪里开始?我是从高级BDD测试开始的吗?我是从低级TDD测试开始的吗?
答案 0 :(得分:67)
老实说,我没有看到BDD和TDD之间的区别。
那是因为没有。
我的意思是,两者都只是测试预期会发生什么。
那是错的。 BDD和TDD绝对没有任何关于测试的东西。没有。纳达。小人物。压缩。尼克斯。没有丝毫。
不幸的是,TDD在几乎所有内容中都有“测试”一词(不仅在其名称中,而且在测试框架中,单元测试中,TestCase
(您经常继承的类),{{1} (通常持有你的测试的类),FooTest
(测试方法的典型命名模式),以及许多与测试相关的术语,如“断言”和“验证”),这导致一些人相信它实际上确实与测试有关。因此,一些聪明的人说:“嘿,我们只需更改名称”,以消除任何混淆的可能性。
这就是BDD。它只是TDD,任何与测试相关的术语都被行为相关的术语术语所取代:
testBar
→assert
BDD只是带有不同字词的TDD。如果你做正确的TDD,你就是在做BDD。不同之处在于 - 如果您至少相信Sapir-Whorf假设的弱势形式 - 不同的词语可以更容易地做到正确。
答案 1 :(得分:28)
BDD来自客户的观点,并专注于整个系统的预期行为。
TDD来自开发者的观点,并专注于一个单元/类/功能的实现。它受益于更好的架构(可测试性设计,模块之间的耦合较少)。
从技术角度(如何编写“测试”)它们是相似的。
我会(从敏捷的角度来看)从一个bdd-userstory开始并使用TDD实现它。
答案 2 :(得分:5)
根据我在维基百科上收集的内容,BDD包括在没有利益相关者/用户输入的情况下无法完成的接受和QA测试。此外,BDD使用自然语言来指定其测试,而TDD通常使用编程语言。两者之间可能存在一些重叠,但我认为这不是模糊性,而是BDD的语言是主要区别。
至于你要从哪里开始,那真的取决于你的开发过程,不是吗?我假设如果你正在自下而上,你将首先编写TDD,一旦达到更高级别,你将使用BDD来测试这些功能是否按预期工作。
正如k3b所指出的那样:主要区别在于BDD是面向问题域的,而TDD是面向更多的解决方案域。
答案 3 :(得分:4)
只是复制来自Matthew Flynn的答案,我同意的不仅仅是" TDD和BDD与测试无关":
行为驱动开发是测试驱动开发的扩展/修订。其目的是帮助设计系统的人(即开发人员)确定要编写的适当测试 - 即反映利益相关者所需行为的测试。效果最终是相同的 - 开发测试,然后开发通过测试的代码/系统。 BDD的希望是测试实际上对于显示系统满足要求非常有用。
更新
代码单元(单个方法)可能过于细化而无法表示行为测试所代表的行为,但您仍应使用单元测试对其进行测试,以确保它们正常运行。如果这是你的意思" TDD"测试,然后是,你仍然需要它们。
答案 4 :(得分:2)
关于TDD和BDD之间差异的精彩文章:
应该为您提供您需要知道的一切,包括两者的问题和示例。
答案 5 :(得分:2)
BDD就是让你的TDD正确。它为您的TDD提供“结构和diciplene”。它指导您测试正确的测试并进行适当的测试。这是一篇关于BDD和TDD的精彩帖子,
http://codingcraft.wordpress.com/2011/11/12/bdd-get-your-tdd-right/
答案 6 :(得分:1)
我认为BDD对TDD或任何其他方法的最大贡献是使非技术人员(产品所有者/客户)成为各级软件开发过程的一部分。
用自然语言编写可执行方案几乎弥合了需求和交付之间的差距。
产品所有者可以自己运行他编写的场景,并使用不同的数据集进行测试,如果他想要解决开发团队编写的代码的行为。
太棒了!客户坐在中心,不仅仅是询问他真正想要的东西,还要验证和体验可交付成果。
答案 7 :(得分:0)
术语不同,但在我的工作中,我使用TDD开发细节,主要用于单元测试,BDD更高级别,适用于客户,QA或无技术人员。
答案 8 :(得分:0)
主要区别仅在于措辞。 BDD使用更冗长的样式,因此几乎可以像句子一样阅读。