65.9K
CodeProject 正在变化。 阅读更多。
Home

向行为驱动开发 (BDD) 致敬 - 第一部分

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (58投票s)

2011年1月19日

CPOL

6分钟阅读

viewsIcon

253257

本文描述了行为驱动开发(BDD)从开发者未能正确遵循 TDD 的常见问题中的自然演变。它还简要介绍了领域驱动设计(DDD)和领域特定语言(DSL),它们与 BDD 自然相关。

引言

这是“向行为驱动开发问好”系列两部分中的第一部分。本部分将向您介绍行为驱动开发的概念。

第 2 部分包含关于遵循行为驱动开发构建应用程序的分步说明。

几乎所有开发者的简史(或故事)

几乎所有的开发者都比编写测试代码更喜欢编写代码。“先写代码,赶上截止日期,如果时间允许或我感觉良好,我就会写一些测试代码”——这是几乎每一个开发者的普遍心态。有趣的是,他们都知道编写测试代码的好处。甚至有很大一部分人知道在软件开发生命周期中采用 TDD(测试驱动开发)的好处。但仍然很少有人能够采用 TDD 并坚持下去。

脑海中浮现的问题

问题是,为什么开发者在编写测试代码时感到不舒服?有没有办法克服这个问题?

通过真实示例说明问题

让我们来尝试找到这些问题的答案。

假设 X 先生是一位资深 .NET 开发者,他将开发一个基于 Web 的电子邮件程序。他的开发经理、主管或产品负责人给出了电子邮件程序的规格如下。

作为产品负责人,我希望得到一个基于 Web 的电子邮件程序,通过它可以在线撰写电子邮件并发送电子邮件。

非常简单的规格!

现在,X 先生尝试遵循 TDD,并开始思考可能存在的测试用例。

  1. 如果“收件人”地址有效,该程序应发送电子邮件。
  2. 即使“收件人”地址无效,如果“抄送”地址有效,该程序也应发送电子邮件。
  3. 即使“收件人”和“抄送”地址都无效,如果“密送”地址有效,该程序也应发送电子邮件。
  4. 即使主题行为空,该程序也应发送电子邮件。
  5. 即使正文为空,该程序也应发送电子邮件。

现在,在解决了这 5 个问题后,他开始认为,如果修改了第 1、2 和 3 点中提到的选项,可能会有一些额外的测试用例。即使考虑到电子邮件正文的格式(例如纯文本、富文本或 HTML),可能也会有更多测试用例。如果正文是 HTML,那么他需要考虑 HTML 编码问题。

资深的 .NET 开发者 X 先生越是努力思考找出可能的测试用例,他就发现越多的测试用例,而像其他开发者一样,他可能只会写很少的测试用例,或者根本不写,并想着——“一旦我的功能实现,我一定会写测试用例”。

但一如既往,一天结束时,几乎没有写任何测试用例,TDD 也随之消失了!

让我们找到治疗方法!

到目前为止,我们已经了解了问题的性质和症状。现在让我们开始挖掘可能的解决方案。

如果产品负责人、主管或开发经理提供的需求包含了模块可能的行为,会怎么样?为了详细说明并更具体地说,如果需求以一种能够充分表达模块行为及其可能边界点的方式给出,那么决定需要编写哪些测试用例,哪些不需要,就会变得非常容易。

研究人员花费了大量时间来确定一种易于技术人员和非技术人员理解的“需求规格”格式。专家将这种语言称为通用语言领域特定语言(DSL)。我不会详细介绍这一点,但正如我已经提到的,它的目的是在技术人员和非技术人员之间建立一座桥梁。

如今,“DDD (领域驱动设计)”这个词非常流行,而通用语言或 DSL 是它的第一个阶梯。如果您有兴趣了解更多关于 DDD 的信息,请在 Google 上搜索 DDD 并享受您的 DDD 世界之旅!

您可能想知道,我为什么要将通用语言或 DSL 引入解决每个开发者生活中一个复杂问题的中间环节?幸运的是,这种通用语言类型将解决我们的问题。您肯定想知道如何解决?

有一些优秀的开发者开发出了一种语言,任何背景的人都可以编写,并且地球上的任何人都可以阅读和理解。有趣的是,这种语言有一些解析器,可以将这种纯英文解析成您喜欢的编程语言的可编译代码。

只需要遵循一条规则,无论您写什么,都要使用给定-当-那么步骤。感到困惑?这真的很简单。甚至我也可以写,并且我正在使用这个指南来编写上述需求。

给定一个已开发的基于 Web 的电子邮件模块
并且我使用适当的身份验证来访问它

我在“收件人”字段中输入发件人电子邮件地址
或在不将“收件人”字段留空的情况下在“抄送”字段中输入发件人电子邮件地址
或在不将“收件人”字段留空的情况下在“密送”字段中输入发件人电子邮件地址
并且保持主题字段非空
并在接受富文本的正文文本区域中输入内容
并按下或单击发送按钮

那么我的电子邮件将被发送
并且该事件将被记录在日志文件中。

写起来、读起来、理解起来不简单吗?它是不是涵盖并描绘了所有可能的测试用例?嘿!它实际上是不是在编写要开发的电子邮件模块的文档?

我知道上述三个问题的答案都是肯定的!我还有一件更令人兴奋的事情想和您分享,但在此之前,让我们先关注上述规格,从中提取一些我们需要知道的额外信息。

您可以看到,除了给定-当-那么步骤之外,我还使用了和/或来连接不同的规格或边界点,并且您实际上可以添加尽可能多的组合和/或来详细说明您的规格。尽管如此,它仍然对任何人完全可读。

哦!我忘记提这种语言的名字了。它被称为Gherkin。您可以访问这个链接来了解更多关于它的信息。

这种类型的需求实际上描绘了模块开发完成后将如何表现,开发人员可以更专注于行为而不是编写测试用例。这种现象被称为行为驱动开发(BDD),我确信您现在已经理解了 BDD 的基本概念。

有一些(当然是免费的)工具可以实际解析 Gherkin 语言的规格,并用您喜欢的语言创建测试用例,这难道不足以触发“SayWOW”事件吗? ;)

为了在 .NET 中实现 BDD,我发现 Specflow 是一个很棒的工具,可以集成到 Visual Studio 中(甚至支持 VS 2010!)。如果您在 Google 上搜索更多工具,您肯定会找到更多!

对于 Java,我发现 JBehave 可以满足需求。但同样,通过 Google 搜索,您会找到大量的工具。

第二部分中,我将向您展示如何在 .NET 项目中逐步实现 BDD。

© . All rights reserved.