当前位置: 首页 > 科技观察

本文阐明什么是行为驱动开发

时间:2023-03-17 19:19:10 科技观察

行为驱动开发(Behavior-DrivenDevelopment,BDD)的概念来源于测试驱动开发,强调使用DSL(DomainSpecificLanguage,领域特定语言)来描述用户行为,定义业务需求,是需求分析师、开发人员和测试人员进行沟通的有效方式。DSL是一种比自然语言更准确的编码实现,能够以符合领域概念的形式满足所谓“活文档”的要求。可以说,行为驱动开发将编码实现和业务行为描述完美结合,走出了一条业务分析师、开发人员和测试人员都能接受的中庸之道。行为驱动开发的核心在于“行为”。当业务需求被划分到不同的业务场景中,并以“Given-When-Then”的形式描述时,就形成了一个范式的领域建模规范。编写领域特定语言的过程实际上是一个不断发现领域概念的过程。因此,BDD开发最重要的输出不是可以自动运行的验收测试,而是提供一个团队交流的平台,并在其约束下完成领域建模。由于在这个过程中涉及团队的不同角色,保证了领域模型的一致性和准确性。在进行行为驱动开发时,需要避免两种错误??倾向:从UI操作来表达业务行为来描述技术实现而不是业务需求。比如我们要写“发送邮件”的业务场景,可能会这样写:“James”withpassword“123456”AndIsigninAndIfillin“mike@dddpractice.com”in“to”textboxAndfillin“testemail”in“subject"textboxAndfillin"Thisisatestemail"in"body"textareaWhenIclickthe"sendemail"buttonThentheemailshouldbesensuccessfullyAndshownwithmessage"theemailissentBehavior,buttheoperationprocessthatuserinteractswiththroughtheUI.这种做法实际上让用户界面捆绑了你对领域行为的了解。种UI交互操作不属于业务行为,比如上面场景中提到的按钮和文本框控件,与发送邮件功能无关,可能换个UI设计,使用的控件完全不同.那么换成这样的写法呢?Scenario:sendemailGivenauser"James"withpassword"123456"AndIsigninafterOAuthauthentificationAndIfillin"mike@dddpractice.com"asreceiverAnd"testemail"assubjectAnd"Thisisatestemail"asemailbodyWhenIsendtheemailThenitshouldconnectsmtpserverAndallmessagesshouldbecomposedtoemailAndacomposedemailshouldbesenttoreceiverviasmtpprotocal该场景的编写暴露了不必要的技术细节,如连接到smtp服务器,消息组合成邮件,通过smtp协议发送邮件等。对于BDD,场景应该关注做什么,而不是怎么做。如果我们在业务分析过程中纠结于技术细节,可能会导致我们忽视业务价值。在业务建模阶段,业务是重点,不能追尾。那么,怎么写呢?当我们使用DSL编写业务场景时,不需要考虑任何UI操作,甚至需要将设计好的UI原型扔掉,不需要考虑任何技术细节。写好业务场景后,可以验证:如果我们改变UI设计,调整UI布局,是否需要修改业务场景?同样,如果我们改变了技术实现方案,是否需要修改业务场景?以下场景采用业务行为写成:场景:sendemailGivenauser"James"withpassword"123456"AndIsigninAndIfillinasubjectwith"testemail"Andabodywith"Thisatestemail"WhenIsendtheemailto"Mike"withaddress"mike@dddpractice.com"ThentheemailshouldbesentucessfullyWewanttoregardtherequirementsdescribedbytheDSLasareadablescenarioSpecification(Specification),throughwhichitaccuratelyrepresentsthedomainknowledge,canhelpusextracttheimplicitdomainconcept.例如:Scenario:validatethegivendateforreportingperiodGiventhereportingperiodasprior13monthtoreportmonthAndthereportingmonthis"April2018"Whenuserchoosethe"April2017"ThenvalidationresultistrueWhenuserchoose"March2017"Thenvalidationresultisfalse场景描述中的ReportingPeriod包含了与财务报表相关的领域知识,即有效报表周期为13个月,ReportingPeriod应亲自履历证明给定日期是否有效。【本文为专栏作家“张艺”原创稿件,转载请联系原作者】点此阅读更多该作者好文