【不要错过文末彩蛋】
上面这个例子,写的就是描述一个计算器加法的一个例子,是不是非常直观易懂,上面的文件,其实叫Feature(特性文件)。那为什么容易看懂呢因为其使用了Gherkin语法。那么Gherkin是什么呢其实,Gherkin语法就是使用 Given,when,then等关键字词来描述一个用户故事(User Story)。形成一份不论是客户,业务分析人员,测试,还是开发,都能读懂的文件格式。具体定义和用法请大家参考这个链接。
需要说明的是,请大家注意左边的红色的关键字,Feature,Scenario,Given,When,And,Then; 这些关键字其实就是Gherkin语法定义的标准关键字,其主要的关键字如下,
-
Feature
-
Background
-
Scenario
-
Given
-
When
-
Then
-
And
-
But
-
- *
-
Scenario Outline
-
Examples
上面的关键字中有一个examples的关键字,这个关键字非常的好,不知道大家发现没有,人们在日常交流的过程中,有的时候,为了让大家对某一件比较复杂或者难以理解的,或者容易产生歧义的事情,喜欢举个例子,Gherkin也不例外,为了让大家在使用行为驱动开发的过程,相互协作的各个团队之间,更好的理解需求,举个例子是一个非常好的方式。下面咱们可以看一个使用Gherkin中的examples的例子,
故事上下文如下:
虽然现在已经进入了无现金交易的时代,但是我们有的时候还是需要去银行取点现金,那我们就看一个取钱的例子吧。
那么,通过这张图,我想您一定能立马发现,所有的需求流动和维护都是单方向的,而我们知道,软件的需求其实就是软件的目标,就是我们应该交付的产品,是我们应该要做的正确的事情。而对于用户的需求而言,有的时候其实是很复杂的,有的时候客户在提出某一想法的时候,其实压根自己也不知道最终需要一个什么产品,只是大概模糊的知道需要实现一个功能,而且客户的想法和最终实现这个产品的开发人员做出来的东西最终肯能会不太一样,因为开发人员可能已经开始根据最初的需求文档已经把代码实现了,QA也把测试用例写好了,但是QA根据需求文档写出的测试用例和开发人员开发出来的产品的可能根本匹配不上,好多的工作就这样白白浪费了,于是团队成员抱怨了。
另外,谁有能保证业务人员把需求文档写出来后,没有歪曲和误解商务人员告诉给他的需求和想法,开发人员能通过文档把业务分析人员写的东西全部理解透吗的时候业务需求文档,真的不是特别的有趣,没有例子,比较抽象,有歧义。怎么办么办么办要话说三遍,那有没有一种媒介,可以让大家及时的,基于同一个平台的交流,而且用于交流的媒介,对于需求的描述也非常的生动,会根据以后软件的行为进行分类,并提供一些生动的例子呢下面我们看看BDD会如何做。
从上图可以看出,当一个需求过来的时候,先通过项目干系人都能理解的Feature文件,描述项目的User Story, 有的里面还有详细生动的数据范例(examples),从而能够让所有的人更加容易理解其需求, 比如,
是不是感觉很强大啊!!!! 下面进入实战。咱们以Java代码为例子,
结合Cucumber,JUnit以及Maven给大家演示。
3.1 建立一个Maven项目并添加Cucumber依赖库
首先,我们建立一个Maven的项目,名字就叫BDDKata,为什么叫这个名字呢/p>
既然是基于Java Cucumber 的类库去实现BDD,那么我们首先要把Cucumber相关的jar通过Maven的依赖(Dependency)加入进来,
3.2 安装Cucumber Eclipse插件
为了支持Feature的Gherkin语法,我们需要在Eclipse开发环境里面安装下面的插件:
https://cucumber.io/cucumber-eclipse/update-site
具体安装方法,请到百度或者google搜索。
3.3 新建一个Feature文件,编一个需求
为了简单起见,我们选择一个买服装的一个场景,下面是根据和业务人员调研后,业务分析人员得到的一个服装店收银台的一个例子,
里面总共有3个场景(Scenario),
第1个场景:
假设一件衬衣的价格是200,买了 n件,其价格应该是多少钱
第2个场景:
买了两件衬衣,总共是多少钱/p>
第3个场景:
买了一件衬衣和一双鞋是多少钱/p>
3.4 运行Feature文件,生成Cucumber的步骤(Steps)代码
当我们选中这个Feature文件(Checkout.feature)文件的时候,我们运行Cucumber Feature的时候,如下图。
那么明明上面笔者说了只有3个场景,那为什么提示的时候,是4个场景呢
原来,第一个场景描述里面有一个Examples,里面举了2个例子,在加上后面的2个所以是4个。15个
步骤,指的是Gherkin关键字所对应的语句(Given,When,And,Then 等等),注意带有Examples的第一个场景,因为有2个example,所以要乘以2。
根据提示,我们把胶水代码从上面的控制台输出拷贝下面,并新建一个java类:CheckoutSteps ,文件名字为CheckoutSteps.java,内容如下:
3.5 在步骤代码里面加上JUnit的断言并根据断言驱动业务实现
根据BDD的开发的原则,先写BDD的步骤代码(Steps)和单元测试代码,然后再写实现代码,因为实现代码还没有写,所以先写的骤代码(Steps)和单元测试代码肯定运行失败,但是没有关系,这个时候我们就可以写业务实现代码了,然后让单元测试通过,一旦单元测试通过,我们就可以对代码进行重构,上面的步骤简称RGB(红绿蓝),具体含义大家请参考这篇文章。
3.5.1 修改步骤代码并编写单元测试
在根据Feature文件生成的步骤代码中(Steps)中,写上业务实现的类的对象和以及其方法,通过Cucumber中定义的Steps(带有When,Given,then , And的关键字),获取Feature文件里面的数据,最后写上单元测试的断言,具体代码如下

注意: 因为业务实现代码暂时还没有实现,比如Checkout类,以及Checkout类的中add() 方法,所以Eclipse开发环境出现编译异常,不要紧,因为这是BDD&TDD的一个必经的步骤。
3.5.2 编写业务实现
下面咱们通BDD的测试用例来驱动业务代码的开发,驱动出来的业务代码如下:
3.5.3 重新运行测试
这个时候,我们发现,CheckoutSteps类里面的异常消失了。
那么如何自动运行单元CheckoutSteps定义的Step以及其中的单元测试呢/p>
这个时候,我就需要加入一个启动BDD的Step和单元测试的入口类: RunBDDTest,如下所示意。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!