我在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为我们提供的一些好处。当我们使用的时候 这两种技术的优点我们将拥有“软件 事项“以及”工作的软件“。
答案 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,那么首先编写验收测试(可执行规范),然后让它们驱动您的单元测试和代码。这对于一个小项目来说可能有点过头了,但这是一个很好的练习。