3

我在 TDD 和 BDD 方面都没有经验。是的,我已经为现有代码创建了很多单元测试,但这与这里无关。此外,我不能在工作中使用 TDD/BDD,但想尝试一些爱好项目。

我不确定我目前是否正确掌握了 TDD 和 BDD 之间的区别。目前,我只将 BDD 视为演变的 TDD,其最具决定性的特性是能够在更高级别的抽象(用户故事)上工作,然后是 TDD。在 TDD 中,您基本上可以获得相同的用户故事,但它们不像在 BDD 中那样明确。这是对的吗?

在工具方面,假设上述陈述是正确的,对于 TDD,我应该使用 TestNG 或 JUnit 之类的东西,而对于 BDD,我将受益于 JBehave 之类的工具。

现在的问题是我是否应该首先从 TestNG 和 TDD 开始,并且只有在使用它获得一些成功经验之后才迁移到 JBehave 和 BDD?或者这只是浪费时间,没有任何理由阻止我从一开始就尝试使用 Jbehave 和 BDD?

更新:

在收到关于我的问题的两个很好的答案,并花了一些时间对该主题进行额外阅读后,我忍不住不添加指向我发现的一篇很棒的文章的链接。它只是重复了与下面这个问题的两个答案相同的想法,但可能有更多细节。文章中我最喜欢的部分:

The best way to do that is to leverage BDD and TDD. Here is an approach:

 1. Write requirements as user stories using the BDD grammar/structure.
    Do this collaboratively with the key stakeholders. 

 2. Enter the User
        Stories (feature + scenarios) in a BDD tool. 
 3. Write code to map the
            User Stories to tests.
 4. Write production code using TDD to make the
            tests pass.

如您所见,BDD 不仅仅是正确的 TDD。您可以只使用 BDD 的词汇来改进 TDD,但这就像只使用 BDD 必须为我们提供的一些好处一样。当我们利用这两种技术的优势时,我们将拥有“重要的软件”和“有效的软件”。

4

2 回答 2

3

BDD 专注于测试应用程序的功能,并确保它符合用户故事中所述的应用程序接受标准。

TDD 倾向于专注于较低级别的代码,在每个类的基础上进行测试,而不是在每个功能单元的基础上进行测试。

如果您对想要在用户故事中实现的目标有一个很好的了解——足以列举该功能应该和不应该做的事情的列表——那么您就可以开始 BDD。您可以从该列表中编写一个 BDD 功能文件,在编写一段代码之前执行此操作将使您能够考虑该功能并具体化您的想法。这将帮助您编写更简洁正确的代码。

我建议将 Cucumber-JVM 作为实现 BDD 测试的工具,但有人告诉我 JBehave 在功能上是相似的。

最后,对我来说,BDD 和 TDD 是相互补充而不是竞争的技术——事先进行 BDD 可以更容易地考虑需要什么,从而更容易考虑需要什么低级功能,这反过来又使更容易预先编写单元测试。编写代码后,您将拥有一套测试,可让您证明应用程序符合验收标准。

我做BDD的方式是这样的:

1) 检查用户故事的用户接受标准
2) 编写一个包含测试场景的特征文件(英文)来测试这些条件中的每一个。
3) 实现功能
4) 使用 Cucumber/JBehave 以编程方式实现功能文件中
的测试 5) 确保所有测试通过

然后我们维护一个包含这些测试的库,并将它们作为我们持续集成的一部分运行

功能文件包含特定措辞的说明,例如:

给定一个用户访问我们的应用
当用户点击搜索链接
然后搜索窗口打开并且用户在搜索框中输入XXX
并且用户按下回车
显示搜索结果

于 2012-11-30T13:41:13.317 回答
1

尽管大多数文献都将 TDD 作为单元测试,将 BDD 作为验收测试,但这并不是它们的区别。

在实现层面上,BDD 基本上是 TDD,特别关注语言。BDD 的学习难度并不大,但是您会错过 BDD 的大部分价值,因为它面向团队沟通。

如果您还没有学习 JUnit,我的建议是学习 JUnit,因为它是最普遍的框架。开始 TDD/BDD 最困难的部分是弄清楚如何首先编写测试并设计可测试性。

如果你想学习纯 TDD/BDD,那么首先编写验收测试(可执行规范),让它们驱动你的单元测试和代码。对于一个小项目来说,这可能是矫枉过正,但却是一个很好的练习。

于 2012-11-30T13:34:41.980 回答