cucumber简介

2011-11-30  刘俊 

    很多人在做自动化测试的时候会产生一个疑问,如何让我们的test case和script产生联系?运行一轮自动化脚本以后,如何告诉看不懂script的客户或者开发,你的自动化测试都做了哪些事情?下面将会给大家介绍一款新的工具:cucumber(黄瓜)。
    cucumber是一款基于BDD的测试工具,它一方面通过文字描述测试行为,告诉开发和客户test case是如何进行的,另一方面通过关键字驱动和正则表达式匹配告诉scripts去做哪些事情,在运行自动化测试结束以后,会给出详细的report告诉用户和测试人员,当前测试有哪些步骤,哪些场景,哪些行为得到了执行,多少成功,多少失败,总共耗时多少,甚至一个表格中的一个测试数据没有执行到,都会以显著的颜色标注出test case的第几行出错,对应的script第几行出错。如此以来,无论是不懂代码的客户还是脚本编写人员都可以直观的寻找自己想要的结果。
   cucumber的官方网站是http://cukes.info/,由于它的实现语言是ruby,所以它也是rubygems庞大家族的一份子,安装命令很简单:gem install cucumber。目前cucumber可以和诸多语言开发的程序进行工作,比如ruby,java,.net,flex等等开发的程序进行工作,并且支持多达30多种语言的描述方式。
   cucumber的识别文件是.feature格式的,当然它可以阅读文本文件,使用.txt文件保存场景文件也可以识别,当然我们建议使用.feature格式的文件以便它更快的解析。feature文件中的文字描述必须以cucumber指定的关键字开头,如果不加关键字则默认为注释。文件的默认语言是English,当然如果你想用中文来编写用例,则只需要在feature文件的首行加上# language: zh-CN,如果你的文件想用法语编写,则加# language: fr 诸如此类,更多语言可以运行cucumber --i18n help查看。我们先给一个简单的例子:
Feature: Search
  In order to learn more
  As an information seeker
  I want to find more information

  Scenario: Find what I'm looking for
    Given I am on the Google search page
    When I search for "cucumber github"
    Then I should see
      """
      written in Ruby
      """
上面的代码是Feature文件的一个例子,红色表示文件的开头,注意这里必须以Feature开头。绿色部分由于没有关键字,会被认为是注释部分不执行,但是会打印在report上。蓝色部分是我们test  case的主体部分,每一个scenario代表着一条case,Scenario:后面的部分是当前case要做什么的描述。Given,When,Then这三个关键字描述的分别是case的前置步骤,具体操作,期望结果。那么这条case的解读方式应该是:首先我打开谷歌的搜索页面,当我搜索“cucumber github”,这时我应该看到“witten in Ruby”的搜索结果。这个不难理解吧?如果这三个关键字不能完整表达你的描述,可以加And,比如:
Given ****
And ****
When ****
And ****
Then ****
  保存好Feature文件以后,那么这部分是给不懂代码的客户或者手工测试人员去阅读的,这个和平常设计的test case没有太大差别,最多就是前面加几个关键字。下面给大家介绍几个cucumber最常用的关键字,分别是:
Feature:文件开头的关键字,不加的话cucumber无法识别该文件。
Background:这个关键字表示下面描述的step会在每个Scenario运行之前运行一次。
Scenario:场景关键字,也是每个test case的单位
Scenario Outline:该关键字必须和下面的Examples或者Scenarios结合起来用,后面会说到具体用法。
Examples/Scenarios:这两个关键字下面通常跟的是一个table,里面存放各种测试数据,我们会在运行step的时候调用里面的数据作为参数传到script中。
Given,When,Then,And,But这几个关键字和上面的关键字有所不同,它们不会影响Feature文件运行的顺序,只是起到帮助阅读的作用。Scenario和Scenario Outline都是test case的单位,他们的区别在于,Scenario执行的时候,是从Given开始,到Then结束一轮测试,而Scenario Outline则会根据下面跟的Examples或者Scenarios中的table的行数来决定执行多少次从Given到Then的循环,比如Examples下面的table有4行,那么Scenario Outline会执行4次从Given到Then的循环(table首行默认为列名,不包含在4次之内)。他们各有各的好处,读者可以根据自己想做的事情自己体会。
  当掌握了关键字的特性以后,大家就可以自己尝试编写一个Feature文件,然后在命令行下面运行一下,运行的命令是:cucumber Feature文件名。比如Feature文件名是test.feature,命令是cucumber test.feature,记住要在test.feature保存的路径下运行,否则文件名前面要加具体路径。如果想看看report是什么样子,可以运行命令:cucumber -f pretty -f html -o report.html test.feature。如果提示warning,看不到报告的颜色,可以根据warning的提示到对应地址下载工具安装。
  今天暂时写到这里,后面会写如何编写对应的脚本,以及和自动化测试工具watir,selenium等结合使用。大家有问题可以在下面提,我会一一解答。
772°/7664 人阅读/6 条评论 发表评论

刘俊  2011-11-30

如果感兴趣的人比较多,我会继续写,不多就当给cucumber宣传吧


小窝  2011-11-30

刘俊: 如果感兴趣的人比较多,我会继续写,不多就当给cucumber宣传吧


熊志男  2011-11-30

挺有意思的


小窝  2011-12-28

已同步至官方微博


乐乐  2014-04-01

楼主多写


兔宝贝  2016-02-15

Hi 你好 我有一个cucumber运行的问题,能帮我看看吗? 我用rubymine来跑case. 下面是我的case Scenario: To verify campaigns could be searched by inputting campaign id Given the user visits the Campaign Search page Then the current campaign page must be Campaign Search page When the user search a campaign with following values | campaign ID | 2 | Then the right campaigns should be displayed with campaign ID which include 2 但是如果我把Case变成 Scenario Outline: To verify campaigns could be searched by inputting search condition Given the user visits the Campaign Search page Then the current campaign page must be Campaign Search page When the user search a campaign with following values | | | Then the right campaigns should be displayed with campaign ID which include 2 Examples: | search conditions| search values| | campaign ID | 2 | 在运行Case的过程中就会报错。 error: NoMethodError: undefined method `+' for nil:NilClass -e:1:in `load' -e:1:in `' E:\CMProject\campaign-manager-web\cucumber\projects\campaignmanager\features\Campaign_search.feature:13:in `Given the user visits the Campaign Search page' 第一个Case和第二个Case的区别就是多了一个Examples,第一个能完整的运行,可是第二个就一直有问题。我怀疑是我的rubymine相关设置有问题,但具体不知道问题在哪里?请教大侠一下,我的带examples 的case在别人的rubymine里也能正常运行,实在是头痛啊


登录 后发表评论