行为驱动开发

科技工作者之家 2020-11-17

行为驱动开发(Behavior-Driven Development)(简写BDD),在软件工程中,BDD是一种敏捷软件开发的技术。

简介行为驱动开发(BDD)是测试驱动开发的延伸,开发使用简单的,特定于领域的脚本语言。这些DSL将结构化自然语言语句转换为可执行测试。结果是与给定功能的验收标准以及用于验证该功能的测试之间的关系更密切。因此,它一般是测试驱动开发(TDD)测试的自然延伸。

BDD 作为一种设计方法,可以有效的改善设计,并在系统的演化过程中为团队指明前进方向。

行为驱动开发的根基是一种“通用语言”。这种通用语言同时被客户和开发者用来定义系统的行为。由于客户和开发者使用同一种“语言”来描述同一个系统,可以最大程度避免表达不一致带来的问题。表达不一致是软件开发中最常见的问题,由此造成的结果就是开发人员最终做出来的东西就不是客户期望的。使用通用语言,客户和开发者可以一起定义出系统的行为,从而做出符合客户需求的设计。但如果光有设计,而没有验证的手段,就无法检验我们的实现是不是符合设计。所以 BDD还是要和测试结合在一起,用系统行为的定义来验证实现代码。

虽然行为驱动开发是测试驱动开发的进化,但关注的核心是设计。行为驱动开发中,定义系统的行为是主要工作,而对系统行为的描述则变成了测试标准。在行为驱动开发中,我们需要使用通用语言来定义系统行为。而通用语言,实际上是一个最小化的词汇表。我们使用这些词汇来书写故事。选入词汇表的词汇必须具有准确无误的表达能力和一致的含义。例如“系统”这个词就不符合要求,因为在不同的语境(又称为上下文 Context)中,“系统”一词具有不同的含义。而“自动提款机”则明确标识了一个没有歧义的事物。1

历史Dan North创建了一个BDD框架,JBehave,然后出现了Ruby的BDD框架,称为RBehave,后来被集成到RSpec项目中。他还与David Chelimsky,AslakHellesøy等人合作开发了RSpec,并编写了一本RSpec书:《RSpec,Cucumber等的行为驱动开发》。RSpec中的第一个基于故事的框架后来由主要由Aslak Hellesøy开发的Cucumber取代。Cucumber已成为BDD的首选框架。CukeTest是一款以Cucumber框架为基础的,基于Windows的行为驱动自动化测试的开发软件。1

BDD 实践BDD的做法包括:

确立不同利益相关者要实现的远景目标

使用特性注入方法绘制出达到这些目标所需要的特性

通过由外及内的软件开发方法,把涉及到的利益相关者融入到实现的过程中

使用例子来描述应用程序的行为或代码的每个单元

通过自动运行这些例子,提供快速反馈,进行回归测试

使用“应当(should)”来描述软件的行为,以帮助阐明代码的职责,以及回答对该软件的功能性的质疑

使用“确保(ensure)”来描述软件的职责,以把代码本身的效用与其他单元(element)代码带来的边际效用中区分出来。

使用mock作为还未编写的相关代码模块的替身1

特性注入一个公司可能有多个会带来商业利益的不同愿景,通常包括盈利、省钱或保护钱。一旦某个愿景被开发小组确定为当前条件下的最佳愿景,他们将需要更多的帮助来成功实现这个远景。

然后确定该愿景的主要利益相关者,会带入其他的利益相关者。每个相关者要定义为了实现该愿景他们需要完成的目标。例如,法务部门可能要求某些监管要得到满足。市场营销负责人可能要参加将使用该软件的用户的社区。安全专家需要确保该软件不会受到SQL注入的攻击。

通过这些目标,会定义出要实现这些目标所需要的大概的题目(theme)或者特性集合。例如,“允许用户排序贡献值”或“交易审计”。

从这些主题,可以得到用户功能以及用户界面的第一批细节。2

由外及内BDD是由商业价值--在应用开发中自然增长的商业利益--所驱动的。要认清这个利益的唯一方式,是通过用户接口(通常--但并不总是--图形界面,GUI)理解应用程序。

同样,每一段代码,从用户界面开始,可以视作它使用的其他模块代码的利益相关者。每个代码单元(element)通过与其他单元合作,提供部分行为,从而实现整个应用程序的行为。1

本词条内容贡献者为:

曹慧慧 - 副教授 - 中国矿业大学

科技工作者之家

科技工作者之家APP是专注科技人才,知识分享与人才交流的服务平台。