BDD 是取代还是增强了 TDD?

Does BDD replace or augment TDD?

BDD 是替代 TDD,还是两者一起使用?我一直在读到 BDD 应该只测试用户可以看到的东西。如果是这样,是否意味着需要将 TDD 用于用户看不到的服务方法?

BDD 是 TDD 和 ATDD 的替代品(并派生自它们)。

BDD 的第一个工具 JBehave 实际上是作为单元测试框架 JUnit 的替代品开始的。目的是它允许您描述您的(尚未编写的)系统的行为并提供示例,而无需使用 "test" 这个词,因为在那个阶段它实际上是分析,而不是测试。 "test" 这个词引起了各种混乱!

区别在于examplebehaviourspecification都是problem-space 语言,而单词 test 是解决方案-space。它往往会让人们认为他们了解问题,并正在测试解决方案,如果他们真的不了解,这就是一个问题!

事实证明,避免使用test这个词有助于人们更充分地探索问题。您可以在 Dan North's original article.

中阅读相关内容

当 Dan 在 2003/4 探索 BDD 时,他向当时担任​​业务分析师的 Chris Matts 解释了它。 Chris 说,"But that's just like analysis!" 所以他们开始探索 Chris 如何对整个系统进行分析,以及分析的示例如何工作,Chris 意识到这不仅仅是关于行为和结果,而是关于行为和结果 在上下文中。这形成了我们今天所知道的整个 "Given, When, Then" 语法(当时不叫 Gherkin,因为 Cucumber 不存在)。

所以 Dan 开始在 unit-"testing" 工具之上编写一个 scenario-运行 框架,然后将其作为 RBehave 移植到 Ruby,然后变成了普通的文本并成为黄瓜。那时,BDD 成为了 ATDD 的替代品(这在当时通常是通过使用单元测试工具的令人难以置信的程序脚本完成的)。

您使用的是 JUnit、NUnit 还是任何其他类型的低级别单元测试框架并不重要。如果您根据行为示例进行思考,并通过这些示例进行讨论,那么您就是在进行 BDD。将示例写下来很有用,将它们自动化也很有用,这就是为什么有像 JBehave 和 Cucumber 这样在系统级别工作的 BDD 工具。

我们真的不需要较低级别的特定 BDD 工具,因为开发人员和测试人员很容易将 "test" 映射到 "example" 或 "should" 而无需担心.

不同之处在于人们可以轻松地进行对话,而无需使用 "test" 这个词。

当您为 class 编写 BDD 时,class 的 "user" 通常是另一个 class。因此,就像您根据系统用户可以看到的内容编写场景一样,您可以根据其他 class 可以看到的内容编写较低级别的示例。来自 BDD 的测试是一个非常好的副产品,但对话是最重要的方面,即使对话必须与橡皮鸭进行。

BDD 不会取代 TDD,我认为它是对 BDD 的补充。

全看问题了,商家会不会关心这个?

您想为工作使用正确的工具。也就是说,有些东西非常适合 BDD,而另一些东西更适合 TDD。如果处理得当,BDD 和 TDD 之间的界限会非常模糊。如果它存在的话。

我写了一篇博客 post,其中讨论了一个名为“测试冰山”的概念,http://www.thinkcode.se/blog/2016/07/25/the-right-tool-for-the-job

它可能会为您的问题提供一些额外的启示。

我同意@Lunivore 的观点,与从对话中了解问题相比,工具的选择并不重要。