没有先前的TDD经验,是否有可能研究BDD?

时间:2012-11-30 13:11:49

标签: tdd bdd testng jbehave

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

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

就工具而言,假设上述语句是正确的,对于TDD,我应该使用类似TestNG或JUnit的东西,而对于BDD,我将从JBehave等工具中受益。

现在问题是我应该首先使用TestNG和TDD,并且只有在成功完成后才能迁移到JBehave和BDD?或者这只是浪费时间,没有任何理由阻止我从一开始就试图使用Jbehave和BDD?

更新

在我的问题上收到两个很好的答案,并花了一些时间阅读有关该主题的其他内容后,我无法帮助自己不添加指向我找到的优秀article的链接。它只是重复与下面这个问题的两个答案中相同的想法,但可能有更多细节。我最喜欢的文章部分:

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为我们提供的一些好处。当我们使用的时候     这两种技术的优点我们将拥有“软件     事项“以及”工作的软件“。

  

2 个答案:

答案 0 :(得分:3)

BDD专注于测试应用程序的功能,并确保它符合用户故事中描述的应用程序的规定验收标准。

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

如果您对用户故事中想要达到的目标有充分的了解 - 足以枚举该功能应该和的功能列表。不应该这样做 - 你处于开展BDD的良好位置。您可以从该列表中编写BDD功能文件,在编写代码之前执行此操作将允许您考虑该功能并明确您的思路。这将有助于您编写更简洁的正确代码。

我建议将Cucumber-JVM作为实施BDD测试的工具,但我告诉JBehave功能相似。

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

我做BDD的方式是:

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

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

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

鉴于用户访问我们的应用程序
当用户点击搜索链接时 然后打开搜索窗口 用户在搜索框中输入XXX 并且用户按下输入
显示搜索结果

答案 1 :(得分:1)

虽然大多数文献都把TDD作为单元测试,BDD作为验收测试,但这并不是它们的区别所在。

在实现层面,BDD基本上是TDD,特别注重语言。 BDD并不是很难学习,但是你将失去BDD的大部分价值,因为它适合团队沟通。

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

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