使用Cucumber有一段时间了。最近又重读了一下《Cucumber:行为驱动开发指南》,有点想法,分享读书笔记在这。
一、什么是BDD
首先谈一下行为驱动开发(behavior-driven development,BDD),与之对应的就是测试驱动开发(Test-Driven-Development TDD)。BDD相当于对TDD的扩展,它打破了TDD由外向内的模式。简而言之他提供了研发、测试、需求的团队都能读懂的实例。各个团队根据实例第一时间得到反馈,相较于TDD他的迭代速度更快。更适合当前敏捷开发的趋势。
二、Cucumber基本结构
Cucumber框架主要分为业务层和技术层。分过面对业务人员和技术人员。下面用C#代码集成Cucumer插件举例。额外提一句Cucumber for .net 的名字是Specflow。
业务层:
Feature: Login \\feature file
In order to logon portal
@mytag \\tag
Scenario:(90.01) Login Portal \\Scenario
Given Login into portal \\Step
When Open menu "Menu | Main | Calendar | 2015"
When Click on "New"每个Scenario由一系列的step组成,Cucumber会一一执行这些step。这些step支持简体中文、繁体中文、日文、韩文和英文在内的15种语言,定义是根据step具体执行内容定义。方便业务人员阅读。每个step相当于技术层提供的借口,具体实现方式由技术层实现。如果一个Scenario中所有的step都执行成功,该Scenario就会被标记为pass状态,反之为fail状态。多个Scenario构成Feature文件。Cucumber为每个Scenario提供tag方便对Scenario类型进行区分,也可作为标志位对不同Scenario进行差异化处理
技术层:
namespace Cucumber
{
[Binding]
public class Common
{
#region Login statements
[Given(@"Login into portal")] \\通过正则表达式匹配
public void login() \\Cucumber绑定对应step的方法
{
ObjectManager.CurrentPage.Login(); \\方法的具体实现
}
[When(@"Open menu ""([^\""]*)""$")]
public void openMenu(string menuPath)
{
Assert.IsTrue(ObjectManager.Menu.Open(menuPath), "can not open menu " + menuPath);
}
[When(@"Click on ""([^\""]*)""$")]
public void ClickOnButton(string Label)
{
BLL.PageHelperFactory.Page.ClickOn(Label);
}
#endregion
}
}技术层分为step definitions,support code, automation library三部分。后面两层即为具体实现。主要谈一下step definitions,Cucumber通过正则表达式匹配对应的step,这样大大增加的匹配的灵活性,我们同样可以在step中设置相应的参数。每个step前会添加Given, When的前置字符串,这些单词可以更好的树立step的结构,没有实际意义。正则表达式下面即为与之绑定的方法。每个step通过下面的方法实现。
三、Cucumber执行的具体流程
Cucumber执行具体流程:
执行每个Cucumber程序集时,Cucumber会从要执行的feature文件的第一个Scenario的第一个Step依次开始执行。相应得step运行时,对应的step会在step definitions中找寻与之匹配的正则表达式,从而找到与之对应的方法,进而执行相应的功能。
Scenarios执行流程图:
Scenarios的运行方式上图交代的很清楚,就不一一列举各种情况了。Cucumber框架用在B/S上的验收测试上已经很成熟。最近时间有点紧写的可能有些简略,有什么问题欢迎大家留言讨论。