Cucumber入门1 - 传统流程下的使用
2016-06-28 17:31
155 查看
转载:http://www.cnblogs.com/jarodzz/archive/2012/07/02/2573014.html
第一次看到Cucumber和BDD(Behavior Driven Development, 行为驱动开发),是在四年前。那时才开始工作,对软件测试工具相当着迷。只要是开源的、免费的,我就一定要下载,安装,试用。有的工具用途单一、好懂(如Jmeter,Watir);有的工具,则涉及到一些软件领域的独有概念,不好懂,(如STAF,Cucumber)。好懂的,我上手、试用、推广,不亦乐乎;不好懂的,就只能丢在一边,这里面就包括Cucumber。
再次看到Cucumber,已是两年前。我对软件开发的理解也深了些,这一看,可真是个好东西。之后我与Cucumber间发生的故事,稍后慢慢向大家交代。这开篇的第一章,我想献给如当年的我一样,偶然见到了Cucumber和BDD,却不明所以将之丢在一边的家伙们。
初闻Cucumber的人,第一件事一定是来到Cucumber的首页,第一眼看到的一定是
很不幸的是,这六张图不太好懂。因为它们按照BDD的流程来编写的。为了让它们好懂些,我们抛开BDD,采用传统的软件开发模型(设计->编码->测试)来看它。传统流程如下:
为了便于大家理解,我试着修改了一些。
计算器Calculator提供两个功能: 记数push;加和sum。push将数字一一记录在@args数组中;sum则将所有@args数组中的数字累加得和,存入@result中。写完了被测系统,我们来编写测试用例。
原图中的英文描述,被我翻译成了中文。:
支持中、英等自然语言,是Cucumber的特点之一。在Cucumber的帮助文档里,声明它支持包括简体中文、繁体中文、日文、韩文和英文在内的45种语言。
注意:我并未将所有英文都翻译成中文,而是留下了几个关键字:
Feature(功能)
Scenario(情景)
Given(给定)
And(和)
When(当)
Then(则)
它们的含义与原有自动化测试工具中的概念相同,类比如下:
Cucumber放弃了原有的关键字,而选择了左边五种,只是为了更加流畅地支持自然语言。使用Cucumber的关键字,创建了测试用例,接下来,要如何使用Cucumber来运行它呢?
在一台安装好Cucumber的机器上,运行上述测试用例,便可以看到下列输出:
Cucumber首先输出的是测试用例的描述,然后3行总结性地输出:本功能(Feature)有1个情景(1 scenario);5个步骤(5 steps),全部5个步骤均未定义(undefined);运行耗时0.005秒。这里出现了两个新名词:步骤(steps)和步骤定义(step definitions)。在Cucumber中,以关键字Given, And, When, Then开头的每一行,为一个步骤。在两数相加的情景中,一共有5行。因此,结果显示:5个步骤。
如何定义一个步骤,在Cucumber的运行结果中也给出了详细的办法。在3行总结性输出后,紧接着便是:You can implement…即:你可以使用下面的代码段实现步骤定义,然后是4个小的代码段。这些代码段,便是Cucumber依照情境中我们使用的5个步骤,帮助我们生成的步骤定义框架。每个框架都将内容部分空白出来,等待填充。下面,我们来进行步骤定义。
我们依照图2的样子,向中文步骤中填入代码,如下:
步骤定义的过程,就是向代码段——步骤定义框架——中填入代码的过程,即:用代码来描述你期望的,该步骤应该执行的动作。完整的步骤定义是一个函数,它:
以正则表达式作为函数名
匹配值作为参数
以测试人员输入的代码作为内容
因为有了正则表达式的匹配,5个步骤仅需要4个步骤定义。“我向计算器输入50、70”两个步骤,都可以用“我向计算器输入(\d+)”一个正则表达式来描述。匹配值被自动提取出来作为参数,传入代码。注意:所有匹配值,即参数,都是以字符串的形式传递,因此,我加入了num.to_i 与 result.to_i,将得到的字符串转为整形。步骤定义完成,再次执行Cucumber。屏幕将会显示一片绿色。
步骤定义完成后,再次运行Cucumber。Cucumber会找到步骤定义,并按照其代码去执行。结果如下:
步骤定义被我保存在文件夹step_definitions下的a.rb当中。步骤定义所在文件与起始行数,被打印在每个步骤结尾,以方便查找和修改。最后,Cucumber总结性地输出运行结果:1个情景,5个步骤,全部通过。
为了让这个已经十分简单的计算器产生bug,我只好将它改错为:
再次运行Cucumber,结果为:
失败的步骤是用红色标示出来的。在最后一个步骤中,Cucumber期待的结果为120,但得到的是70。注意:失败的情景列表(Failing Scenarios)里列出的是:“两数相加”这个情景所在的文件与起始行数。这是因为一个功能文件内,可能含有多个情景,这种输出可以便于找到出错的情景。
接下来的总结性结果为:1个情景失败(1 failed),5个步骤中,4个通过,1个失败。
作为自动化测试工具的Cucumber,就介绍到这里。
在继续之前,我们先回顾一下本章内容。
它提供了自然语言的支持,我们可以用自然语言描述、并执行测试用例
它提供了自然语言与代码的衔接,通过步骤与步骤定义
它提供了自然语言对代码的调用,当步骤定义结束后,执行Cucumber,它会自动调用步骤定义内的代码运行
它提供了良好的断言(assert)机制。当执行失败时,我们可以看到完成的测试用例,以及明确的失败原因。
第一次看到Cucumber和BDD(Behavior Driven Development, 行为驱动开发),是在四年前。那时才开始工作,对软件测试工具相当着迷。只要是开源的、免费的,我就一定要下载,安装,试用。有的工具用途单一、好懂(如Jmeter,Watir);有的工具,则涉及到一些软件领域的独有概念,不好懂,(如STAF,Cucumber)。好懂的,我上手、试用、推广,不亦乐乎;不好懂的,就只能丢在一边,这里面就包括Cucumber。
再次看到Cucumber,已是两年前。我对软件开发的理解也深了些,这一看,可真是个好东西。之后我与Cucumber间发生的故事,稍后慢慢向大家交代。这开篇的第一章,我想献给如当年的我一样,偶然见到了Cucumber和BDD,却不明所以将之丢在一边的家伙们。
初闻Cucumber的人,第一件事一定是来到Cucumber的首页,第一眼看到的一定是
很不幸的是,这六张图不太好懂。因为它们按照BDD的流程来编写的。为了让它们好懂些,我们抛开BDD,采用传统的软件开发模型(设计->编码->测试)来看它。传统流程如下:
图1,这是一个被测系统——用ruby编写的计算器。
为了便于大家理解,我试着修改了一些。
计算器Calculator提供两个功能: 记数push;加和sum。push将数字一一记录在@args数组中;sum则将所有@args数组中的数字累加得和,存入@result中。写完了被测系统,我们来编写测试用例。
图2,这是为了测试上述计算器,使用Cucumber描述的测试用例。
原图中的英文描述,被我翻译成了中文。:
支持中、英等自然语言,是Cucumber的特点之一。在Cucumber的帮助文档里,声明它支持包括简体中文、繁体中文、日文、韩文和英文在内的45种语言。
注意:我并未将所有英文都翻译成中文,而是留下了几个关键字:
Feature(功能)
Scenario(情景)
Given(给定)
And(和)
When(当)
Then(则)
它们的含义与原有自动化测试工具中的概念相同,类比如下:
Cucumber | Unit Test |
---|---|
Feature (功能) | test suite (测试用例集) |
Scenario(情景) | test case (测试用例) |
Given(给定) | setup(创建测试所需环境) |
When(当) | test(触发被测事件) |
Then(则) | assert(断言,验证结果) |
图3,这是运行Cucumber时的画面。
在一台安装好Cucumber的机器上,运行上述测试用例,便可以看到下列输出:
You can implement step definitions for undefined steps with these snippets: |
Cucumber首先输出的是测试用例的描述,然后3行总结性地输出:本功能(Feature)有1个情景(1 scenario);5个步骤(5 steps),全部5个步骤均未定义(undefined);运行耗时0.005秒。这里出现了两个新名词:步骤(steps)和步骤定义(step definitions)。在Cucumber中,以关键字Given, And, When, Then开头的每一行,为一个步骤。在两数相加的情景中,一共有5行。因此,结果显示:5个步骤。
如何定义一个步骤,在Cucumber的运行结果中也给出了详细的办法。在3行总结性输出后,紧接着便是:You can implement…即:你可以使用下面的代码段实现步骤定义,然后是4个小的代码段。这些代码段,便是Cucumber依照情境中我们使用的5个步骤,帮助我们生成的步骤定义框架。每个框架都将内容部分空白出来,等待填充。下面,我们来进行步骤定义。
图4, 这是一个步骤定义的代码示范。
我们依照图2的样子,向中文步骤中填入代码,如下:
步骤定义的过程,就是向代码段——步骤定义框架——中填入代码的过程,即:用代码来描述你期望的,该步骤应该执行的动作。完整的步骤定义是一个函数,它:
以正则表达式作为函数名
匹配值作为参数
以测试人员输入的代码作为内容
因为有了正则表达式的匹配,5个步骤仅需要4个步骤定义。“我向计算器输入50、70”两个步骤,都可以用“我向计算器输入(\d+)”一个正则表达式来描述。匹配值被自动提取出来作为参数,传入代码。注意:所有匹配值,即参数,都是以字符串的形式传递,因此,我加入了num.to_i 与 result.to_i,将得到的字符串转为整形。步骤定义完成,再次执行Cucumber。屏幕将会显示一片绿色。
图5,它是一个执行Cucumber测试用例,并成功通过的画面。
步骤定义完成后,再次运行Cucumber。Cucumber会找到步骤定义,并按照其代码去执行。结果如下:
步骤定义被我保存在文件夹step_definitions下的a.rb当中。步骤定义所在文件与起始行数,被打印在每个步骤结尾,以方便查找和修改。最后,Cucumber总结性地输出运行结果:1个情景,5个步骤,全部通过。
图6, 这是一个执行Cucumber测试用例,但失败的画面。
为了让这个已经十分简单的计算器产生bug,我只好将它改错为:
再次运行Cucumber,结果为:
失败的步骤是用红色标示出来的。在最后一个步骤中,Cucumber期待的结果为120,但得到的是70。注意:失败的情景列表(Failing Scenarios)里列出的是:“两数相加”这个情景所在的文件与起始行数。这是因为一个功能文件内,可能含有多个情景,这种输出可以便于找到出错的情景。
接下来的总结性结果为:1个情景失败(1 failed),5个步骤中,4个通过,1个失败。
作为自动化测试工具的Cucumber,就介绍到这里。
在继续之前,我们先回顾一下本章内容。
回顾:
Cucumber是一个自动化测试工具它提供了自然语言的支持,我们可以用自然语言描述、并执行测试用例
它提供了自然语言与代码的衔接,通过步骤与步骤定义
它提供了自然语言对代码的调用,当步骤定义结束后,执行Cucumber,它会自动调用步骤定义内的代码运行
它提供了良好的断言(assert)机制。当执行失败时,我们可以看到完成的测试用例,以及明确的失败原因。
相关文章推荐
- iOS调用动态库运行报错dyld: Library not loaded
- MySQL索引背后的数据结构及算法原理
- Java设置session超时(失效)的三种方式
- 百度地图开发
- jdk1.8 ThreadPoolExecutor实现机制分析
- 14.5.4 InnoDB File-Per-Table Tablespaces 每个表一个文件
- 14.5.4 InnoDB File-Per-Table Tablespaces 每个表一个文件
- android:MVP模式学习
- C# 使用easyUI datagrid 实现后台分页
- nginx多域名代理配置文件模版(
- eclipse转成Android studio过程中遇到的问题
- Shell函数:Shell函数返回值、删除函数、在终端调用函数
- spring boot 静态页面展示
- [linux]死锁问题查找问题的相关命令
- 【语言-汇编】圆周率(PI)计算
- UGUI
- 初来乍到
- 推箱子
- bacula配置逻辑结构图
- 使用Apache Shiro进行身份认证-LDAP认证