说实话,我看不出BDD和TDD之间的区别。我的意思是,两者都只是测试是否发生了预期的情况。我见过很详细的BDD测试,它们几乎可以算作TDD测试,并且我见过很模糊的TDD测试,它们对许多代码进行了封装处理。我们可以这样说,我相信同时使用两种测试更好。
但有一个有趣的问题,我该从哪里开始呢?是从高级别的BDD测试开始吗?还是从低级别的TDD测试开始呢?
我真的看不出BDD和TDD之间有什么区别。
那是因为它们没有任何区别。
我的意思是,两者都只是测试是否发生了预期的事情。
这是错误的。BDD和TDD与测试完全无关。完全没有。没有任何关系。尽管TDD中几乎所有地方都有“测试”这个词(不仅在名称中,还有在测试框架、单元测试、TestCase(通常继承自的类)、FooTest(通常包含您的测试的类)、testBar(测试方法的典型命名模式)以及许多测试相关术语,例如“断言”和“验证”),这导致一些人认为它实际上与测试有关。 因此,一些聪明的人说:“嘿,让我们改个名字”以消除任何潜在的混淆。
这就是BDD。 它只是TDD,其中任何与测试相关的术语都被行为示例相关的术语替换:
assert
→ should
BDD只是用不同的词语表述的TDD。如果您正确实践TDD,那么您也在实践BDD。不同之处在于– 假设您至少相信Sapir-Whorf假说的弱形式– 不同的术语使得正确实践更容易。
测试驱动开发(TDD)是一种程序开发方法,其中你交替进行**测试**和代码开发(Beck,2002)。基本上,你逐步开发代码,并为该增量编写一个**测试**。只有当你开发的代码**通过了测试**后,才会继续进行下一个增量的开发。测试驱动开发是敏捷方法(如极限编程)的一部分。
- qxlabBDD从客户的角度出发,专注于整个系统预期行为。
TDD从开发人员的角度出发,专注于一个单元/类/功能的实现。它可以从更好的架构(设计可测试性、模块之间的耦合减少等)中受益。
从技术角度来看(如何编写“测试”),它们是相似的。
从敏捷的角度来看,我会从一个BDD用户故事开始,并使用TDD来实现它。
我认为Matthew Flynn的回答更加准确,他的观点是BDD是TDD的扩展和修订。它的目的是帮助系统设计者(即开发人员)确定要编写的适当测试 - 即反映利益相关方所需行为的测试。最终效果相同-先开发测试,然后开发通过测试的代码/系统。BDD的希望是测试实际上在显示系统是否符合要求时有用。
更新
代码单元(单个方法)可能过于精细以代表行为测试所代表的行为,但您仍应使用单元测试对其进行测试以确保其正常运作。如果这就是你所说的“TDD”测试,那么是的,你仍然需要它们。
术语不同,但在我的工作中,我使用TDD进行详细开发,主要用于单元测试,而BDD更高级,面向客户、QA或非技术人员。
BDD实际上是使用不同术语的设计契约。一般来说,BDD采用Given-When-Then的形式,这大致类似于前置条件(Given)、检查条件/循环不变量(When)和后置条件/不变量(Then)。
请注意,BDD非常类似于Hoare逻辑(即{P}C{Q}或{P}recondition-[C]ommand-{Q}Post-condition)。因此:
BDD只是以不同的措辞重新包装的DbC(Hoare-logic),这意味着它不是TDD。为什么?因为TDD不是关于将前置条件/检查/后置条件合约直接绑定到方法、函数、属性和类状态上的。TDD是在测试方法、函数、属性和类及其离散状态方面迈向更高阶段的步骤。一旦你看清了这一点,并充分理解了TDD不是BDD,BDD不是TDD,而是彼此独立且互补的软件正确性证明技术,那么你就会正确地理解这些主题。你也会正确地使用和应用它们。
我所知道的唯一一个把BDD(Design-by-Contract)原生融入语言规范和编译器的语言是Eiffel。它不是一个带有限制的Frankenstein附加组件。在Eiffel中,BDD(又名DbC)是软件正确性工具箱中优雅、有用、实用和直接参与的一部分。
Wikipedia可以帮助定义Hoare-logic。请参阅:https://en.wikipedia.org/wiki/Hoare_logic
我已经在Eiffel中创建了一个示例,你可以查看。请参阅:
主类: https://github.com/ljr1981/stack_overflow_answers/blob/main/src/so_73347395/so_73347395.e 测试类: https://github.com/ljr1981/stack_overflow_answers/blob/main/testing/so_73347395/so_73347395_test_set.e