BDD - BDD 方式的 TDD


在 TDD 中,术语“验收测试”具有误导性。验收测试实际上代表了系统的预期Behave。在敏捷实践中,强调整个团队的协作以及与客户和其他利益相关者的互动。这就产生了使用项目中每个人都容易理解的术语的必要性。

TDD 让您思考所需的Behave,因此术语“Behave”比术语“测试”更有用。BDD 是测试驱动开发,其词汇重点关注Behave而不是测试。

用 Dan North 的话说,“我发现从测试思维到Behave思维的转变是如此深刻,以至于我开始将 TDD 称为 BDD,即Behave驱动开发。” TDD 专注于某些东西如何工作,BDD 专注于我们构建它的原因。

BDD 回答了开发人员经常面临的以下问题 -

问题 回答
从哪儿开始? 由外向内
要测试什么? 用户故事
什么不应该测试? 还要别的吗

这些答案导致故事框架如下 -

故事框架

作为[角色]

我想要[功能]

这样[好处]

这意味着,“当执行某项功能时,所产生的好处是扮演该角色的人。” '

BDD 进一步回答了以下问题 -

问题 回答
一次性测试多少? 非常不专心
他们的测试该怎么称呼? 句子模板
如何理解测试失败的原因 文档

这些答案导致示例框架如下 -

示例框架

给定一些初始背景,

事件发生时,

然后确保一些结果。

这意味着,“从最初的背景开始,当特定事件发生时,我们知道结果应该是什么。”

因此,该示例显示了系统的预期Behave。这些示例用于说明系统的不同场景。

故事和场景

让我们考虑以下由 Dan North 绘制的有关 ATM 系统的插图。

故事

作为客户,

我想从 ATM 机提取现金,

这样我就不用去银行排队了。

应用场景

这个故事有两种可能的场景。

场景 1 - 账户有信用

鉴于该帐户是贷方

并且卡有效

分配器里装有现金

顾客要求现金时

然后确保账户已被扣款

确保分发现金

确保卡被退回

场景 2 - 账户透支超过透支限额

鉴于账户已透支

并且卡有效

顾客要求现金时

然后确保显示拒绝消息

确保不分发现金

确保卡被退回

两个场景中的事件相同,但上下文不同。因此,结果是不同的。

开发周期

BDD 的开发周期是一种由外而内的方法。

步骤 1 - 编写一个变红的高级(外部)业务价值示例(使用 Cucumber 或 RSpec/Capybara)。(RSpec 用 Ruby 语言生成 BDD 框架)

步骤 2 - 为实现的第一步编写一个较低级别(内部)RSpec 示例,该示例变为红色。

步骤 3 - 实现最低代码以通过该较低级别的示例,看到它变绿。

步骤 4 - 编写下一个较低级别的 RSpec 示例,推动通过步骤 1(变为红色)。

步骤 5 - 重复步骤步骤 3 和步骤 4,直到步骤 1 中的高级示例变为绿色。

注意- 应牢记以下几点 -

  • 红/绿状态是许可状态。

  • 当您的低级测试通过时,您有权编写新示例或重构现有实现。您不得在重构的情况下添加新的功能/灵活性。

  • 当您的低级测试为红色时,您有权编写或更改实现代码,仅用于使现有测试变为绿色。您必须抵制编写代码以通过下一个测试(该测试并不存在)的冲动,或者实现您可能认为好的功能(客户不会问)。