BDD如何补充TDD

时间:2013-10-02 05:27:50

标签: c# asp.net tdd bdd nbehave

由于我听说过BDD(行为驱动开发),我一直在想它是否补充了TDD?它在Web开发中实际有用吗?作为一个忙碌的.net网站开发者,是否值得花时间在BDD和TDD上?当我经历过它时,我发现它非常有趣,但我对它对我们的用处感到困惑!

我已经看过这句话,但它究竟意味着什么?

  

虽然这些工具通常专门用于BDD   项目,它们可以被视为工具的专用形式   支持测试驱动开发。这些工具用于添加自动化功能   无处不在的语言是BDD的核心主题。

4 个答案:

答案 0 :(得分:4)

首先,一些定义;

TDD是测试驱动开发,顾名思义,我们生产的测试推动了我们的开发流程。它通常与Red-Green-Refactor循环一起描述。所以在实践中我们编写一个单元测试并且它失败了,给我们一个Red状态,然后我们修复了我们的应用程序的代码,直到我们通过测试,给我们一个Green状态,最后我们重构我们的应用程序代码和我们的测试代码所以我们有很好的设计。良好的TDD通过将每个测试集中在我们想要测试和注入模拟依赖项的类中的单个方法上来工作,因此我们测试尽可能少的代码量,这导致测试套件出现单个错误,导致单个失败。

BDD是行为驱动的开发,其中行为是我们设计过程的驱动因素。当您遵循BDD流程时,您会与人们一起研究您的应用程序应该如何运作,它的功能是什么,并捕获它应该运行的场景的一些示例。事实上,我们也可以将BDD视为我们收集新应用程序的一个循环应用程序应该具有的功能,验证应用程序是否适用于所有场景,可能重构我们的测试,使它们最有意义,并重复一遍。 BDD测试通常需要许多类协作才能生成单个业务功能,因此即使错误只触发一个错误,您仍然需要大量代码来跟踪负责的代码。

此时您可以看到BDD的工作水平高于TDD,事实上我已经看到BDD外循环成功地用于在多个组织中驱动TDD内循环,即

Define new business feature
 ---> Add scenario and test: BDD Red
|     -> Add Unit test: TDD Red
|    |   Add application code: TDD Green
|     -- Refactor code: TDD refactor
|    Scenario passes: BDD green
 --- Refactor feature and scenarios: BDD refactor
Feature complete

Gojko Adzic在他的演讲中TDD:Breaking the mould

更好地描述了这一点

它在Web开发中的实际用途如何? BDD在用于收集需求和BDD工具的过程方面非常有用,可以自动确认您的代码库具有业务所需的所有功能。我发现BDD最适合集成样式测试,许多类协作,而不是单一测试专注于单一方法。

您可以使用BDD构建应用程序逻辑,并可以使用它来测试您的大多数网站。我个人会回避测试用户界面,而是使用诸如“当用户搜索BDD”之类的语言时使用代码隐藏,但有些人使用Selenium并编写谈论点击和测试框的测试“当用户进入时搜索文本框中的BDD并单击搜索按钮“。

是否值得花时间在BDD以及TDD作为.net中繁忙的网络开发者?

希望到现在你应该能够自己回答这个问题。您需要确定将BDD引入流程需要获得多少好处。您的收益将根据您选择的团队规模和工具等因素而有所不同。

我注意到您正在通过使用nBehave标记问题来查看BDD工具的纯文本规范形式。这使您可以让BA团队处理纯文本方案并将其提交回来(尽管不要将其全部留给他们,您需要一些技术输入来保持场景的一致性)。其他形式的工具(如mSpec)以另一种方式工作,使用C#来描述场景并在构建过程中生成纯文本。 我个人使用SpecFlow,它具有nBehave的所有好处,但它的测试可以通过nUnit runner,resharper和你的构建服务器运行。但是,您可能希望将集成测试与单元测试分开,并报告不同级别的覆盖率,例如。

最后

  

虽然这些工具通常专门用于BDD   项目,它们可以被视为工具的专用形式   支持测试驱动开发。这些工具用于添加自动化功能   无处不在的语言是BDD的核心主题。

这意味着BDD工具以与现有TDD工具类似的方式工作,并且知道如何生成或理解Given When Then的BDD语法。有关这方面的更多信息,我建议您阅读https://github.com/cucumber/cucumber/wiki/Gherkin

如果你想进一步了解BDD作为一个过程,那么Liz Keogh有很多非常好的材料,从这里开始http://lizkeogh.com/behaviour-driven-development/

(哎呀,这比我开始的时候要长得多)

答案 1 :(得分:1)

TDD和BDD之间的关键区别在于范围。 TDD是一种开发实践,而BDD是一种团队方法。在TDD中,开发人员在BDD中编写测试,自动规范由用户或测试人员创建(开发人员将他们连接到测试中的代码。)对于小型,共址,以开发人员为中心的团队,TDD和BDD实际上是相同。

对您的两个问题here都有全面的答案。

您可以找到TDD和BDD的一些代码示例here

答案 2 :(得分:1)

BDD complements TDD

与Cucumber(以及BDD一般)的想法是,利益相关者协助编写方案 - 或可执行规范。这解决了我们从哪里开始TDD问题。

http://dannorth.net/introducing-bdd

答案 3 :(得分:1)

BDD以正确的方式完成TDD,Dan North本人是TDD培训师,他发现如果我们可以用行为代替Test,那就更有帮助了。

BDD的关键原则是

  1. 从外到外工作 - >测试第一种方法,以及外部方法,编写将测试您的外部世界接口的测试,这意味着编写测试来测试系统的行为

  2. 无所不在的语言 - >非技术人员和技术人员都能理解的语言,即GWT(当时给定)格式的出现

  3. 使用示例 - >示例是行为测试应该通过的一组输入和输出。