一文讲清楚什么是行为驱动开发

标签 | 行为驱动开发

作者 | 张逸

行为驱动开发(Behavior-Driven Development, BDD)的概念来自于测试驱动开发,强调使用DSL(Domain Specific Language,领域特定语言)描述用户行为,定义业务需求,是需求分析人员、开发人员与测试人员进行沟通的有效方法。DSL是一种编码实现,相比自然语言更加精确,又能以符合领域概念的形式满足所谓“活文档(Living Document)”的要求。可以说,行为驱动开发将编码实现与业务行为描述完美地结合起来,走出了一条业务分析人员、开发人员与测试人员都能接受的中庸之道。

行为驱动开发的核心在于“行为”。当业务需求被划分为不同的业务场景,并以“Given-When-Then”的形式描述出来时,就形成了一种范式化的领域建模规约。编写领域特定语言的过程,其实就是不断发现领域概念的过程。因此,采用BDD进行开发,最重要的产出不是可以自动运行的验收测试,而是它提供了团队交流的平台,并在其约束之下完成了领域建模。由于团队的不同角色都参与了这个过程,就保证了领域模型的一致性与准确性。

在进行行为驱动开发时,需要避免两种错误的倾向:

  • 从UI操作去表现业务行为
  • 描述技术实现而非业务需求

例如,我们要编写“发送邮件”这个业务场景,可能会写成这样:

Scenario: send email

Given a user "James" with password "123456"
And I sign in
And I fill in "mike@dddpractice.com" in "to" textbox 
And fill in "test email" in "subject" textbox
And fill in "This is a test email" in "body" textarea

When I click the "send email" button

Then the email should be sent sucessfully
And shown with message "the email is sent sucessfully"

该业务场景描写的不是业务行为,而是用户通过UI进行交互的操作流程。这种方式实则是让用户界面捆绑了你对领域行为的认知。准确地说,这种UI交互操作并非业务行为,例如上述场景中提到的button与textbox控件,与发送邮件的功能并没有关系。或许换一个UI设计,使用的控件又完全不同了。

那么换成这样的写法呢?

Scenario: send email

Given a user "James" with password "123456"
And I sign in after OAuth authentification
And I fill in "mike@dddpractice.com" as receiver
And "test email" as subject
And "This is a test email" as email body

When I send the email

Then it should connect smtp server
And all messages should be composed to email
And a composed email should be sent to receiver via smtp protocal

该场景的编写暴露了不必要的技术细节,如连接到smtp服务器、消息组合为邮件、邮件通过smtp协议发送等。对于BDD而言,场景应该关注于做什么(what),而不是怎么做(how)。如果在业务分析过程中,纠缠于技术细节,就可能导致我们忽略了业务价值。在业务建模阶段,业务才是重心,不能舍本逐末。

那么,该怎么写?当我们使用DSL编写业务场景时,不要考虑任何UI操作,甚至需要抛开业已设计好的UI原型,也不要考虑任何技术细节。在编写好业务场景之后,可以验证:如果我们更换了UI设计,调整了UI布局,是否需要修改业务场景?同理,如果我们改变了技术实现方案,是否需要修改业务场景?如下场景采用业务行为的形式编写:

Scenario: send email

Given a user "James" with password "123456"
And I sign in
And I fill in a subject with "test email"
And a body with "This is a test email"

When I send the email to "Mike" with address "mike@dddpractice.com"

Then the email should be sent sucessfully

我们要将DSL描述的场景视为一种可读的需求规格(Specification),通过它准确地表现领域知识,就可以帮助我们提炼出隐含的领域概念。例如:

Scenario: validate the given date for reporting period 

Given the reporting period as prior 13 month to report month
And the reporting month is "April 2018"
When user choose the "April 2017"
Then validation result is true
When user choose "March 2017"
Then validation result is false

场景描述中的ReportingPeriod蕴含了与财务报表相关的领域知识,即有效报表周期为13个月,ReportingPeriod自身应该履行验证给定日期是否有效的职责。

本文链接: http://zhangyi.xyz/brief-introduce-ddd/


❈ 题图为马蒂斯有花瓶的一副作品,来自Mono的《LCA》。

原文发布于微信公众号 - 逸言(YiYan_OneWord)

原文发表时间:2018-05-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏即时通讯技术

技术干货:实时视频直播首屏耗时400ms内的优化实践

直播行业的竞争越来越激烈,进过2018年这波洗牌后,已经度过了蛮荒暴力期,剩下的都是在不断追求体验。最近正好在做直播首开优化工作,实践中通过多种方案并行,已经能...

2860
来自专栏Kirito的技术分享

【真荐书】双11书单,我们一起共读 36 + 1 本书

《Redis开发与运维》全面讲解 Redis 基本功能及其应用,并结合线上开发与运维监控中的实际使用案例,深入分析并总结了实际开发运维中遇到的“陷阱”,以及背后...

1453
来自专栏程序人生 阅读快乐

Windows+PowerShell+实战指南

PowerShell既是编程语言,也是一种管理Shell。通过PowerShell几乎可以管理Windows的方方面面。本书是为忙于运维的管理员所编写的参考指南...

1191
来自专栏施炯的IoT开发专栏

第三届Windows Mobile Dev Day纪实

冬至的北京寒风刺骨,但是仍然无法阻挡Windows Mobile开发爱好者的满腔热情。下午1点半,来到霄云路的现代汽车大厦,参加今年的Windows Mobil...

2159
来自专栏好好学java的技术栈

[脑图]如何入门技术、进阶技术(技术开发人员)

1134
来自专栏圆方圆学院精选

【董天一】IPFS:世界正在悄然发生变化

        2015-05-05 Juan Benet 在自己的终端里面敲入了下面的文字:

1281
来自专栏王磊的博客

Spring Boot 终极清单

我上学那会主要学的是 Java 和 .Net 两种语言,当时对于语言分类这事儿没什么概念,恰好在2009年毕业那会阴差阳错的先找到了 .Net 的工作,此后就开...

852
来自专栏机器人网

TI面向先进驾驶辅助系统ADAS应用推视觉软件开发套件

德州仪器 (TI) 宣布推出其视觉软件开发套件 (SDK),从而为开发人员提供了一款灵活的框架、一组丰富齐全的硬件设备驱动程序和一套适用的开发工具,可帮助用户依...

3326
来自专栏互联网技术栈

Druid:实时处理时序数据的OLAP数据库

大数据一直是近年的热点话题,随着数据量的急速增长,数据处理的规模也从GB 级别增长到TB 级别,很多图像应用领域已经开始处理PB 级别的数据分析。大数据的核心目...

1592
来自专栏即时通讯技术

技术干货:实时视频直播首屏耗时400ms内的优化实践

直播行业的竞争越来越激烈,进过2018年这波洗牌后,已经度过了蛮荒暴力期,剩下的都是在不断追求体验。最近正好在做直播首开优化工作,实践中通过多种方案并行,已经能...

1801

扫码关注云+社区