TDD和BDD应该一起使用吗?

9
我来自TDD的思维方式,现在转向BDD。我知道使用BDD是为了确保软件行为和业务目标得到满足。
让我困惑的是,如果我开始使用BDD代替TDD,似乎我不能在如此低的级别进行测试。例如,在以TDD思维方式编写测试时,我可能会测试属性是否已附加到作用域中:
it('should attach properties to scope', function () {

  expect(MainCtrl.items.length).toEqual(1);
});

在做这个的时候,另一个开发者知道作用域分配是预期和未来使用所需的,这样如果他们删除了分配或更改了默认值等,就可以节省一些调试时间。

这个例子没有定义行为,因此不能被视为BDD。当然,我可以重新编写测试描述,使其更加面向行为,比如,“当页面加载时,设置属性以供稍后使用,以便用户可以做某些事情......”,但这似乎太抽象了。

同时使用TDD和BDD是一种惯用做法吗?是否可以通过使用BDD来定义参与项目的所有人(包括非技术人员)的行为,而专门使用TDD来供开发人员使用?

1个回答

9

简短回答,是的。

然而,BDD和TDD之间的区别不是你所提到的那样,我想澄清一下"确保软件的行为和业务目标得到满足"实际上意味着什么 :)

BDD先于开发阶段,包含并超越了开发阶段。BDD远不止是语法,也不仅仅是从"测试"这个词变成"应该"这个词。BDD实际上是一种编写涉及端到端业务的软件的范式。此页面解释了:

BDD是第二代、自外向内、拉动式、多利益相关者、多规模、高自动化、敏捷方法论。它描述了一系列有明确定义输出的交互循环,最终交付重要的工作、经过测试的软件。

BDD始于深思熟虑的发现,在那里一组人聚在一起,使用场景来细化故事的细节。这个小组通常由以下各个领域的1+人员组成:产品、开发和QA-也称为三个朋友。这项练习在开发之前进行,非常擅长在开始开发之前识别缺陷,并通过共享理解创建更好的规范。
一旦你有了一个好的故事和好的场景,就可以使用从外到内的测试方法来推动开发:

Outside-in testing

这意味着您从验收测试开始(如果可能,避免使用UI),随着开发进入系统,您在服务和领域对象等集成和单元级别上采用TDD。在这里,您可以选择任何语法,使用“should”就可以了。
如果您正在使用JavaScript,我们创建了一个名为Chimp的开源工具,使外部测试过程变得容易。
最后,我建议您查看以下链接:

这个话题中我看到的最好的回答之一。问题是,在外部环境下,为什么你会建议“尽可能避免使用UI”呢? - Luis Vasconcellos
2
感谢@LuisVasconcellos。在我的经验中,外部内部最好在域级别上完成。您需要确保域名正常工作。查看六边形架构或清洁架构方法。这是一个链接,将解释我的意思:https://khalilstemmler.com/articles/domain-driven-design-intro/当您使用UI进行测试时,您正在绘制测试的边界过大,因此会出现域泄漏。核心业务领域和UI领域之间存在差异。这是另一个链接:) https://dannorth.net/2011/01/31/whose-domain-is-it-anyway/ - Xolv.io

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接