BDD框架之Cucumber研究

BDD框架之Cucumber研究

 

引用链接:http://kongqingyun123.blog.163.com/blog/static/6377283520134158437813/

 

Cucumber是BDD(行为驱动开发)中成熟的一个框架,官方网址: http://cukes.info/

1、cucumber安装

1、安装ruby
2、gem install cucumber 安装cucumber

2、cucumber介绍

cucumber是一种可以使用文本描述语言来执行自动测试用例的工具,使用的语言叫做Gherkin .

Gherkin用于描述软件的行为而不需要了解具体的实现,的使用主要有两个目的文档和自动测试用例(我们希望能够和手工测试用例也统一)。 Gherkin支持超过40种语言,包括英文、中文。 Gherkin可以在任何地方新增注释,注释已#开头,没一个文件都是已.feature结尾,在feature文件中输入功能描述、场景、步骤,当执行 这个功能时每一个步骤都需要编写ruby代码块来实现具体的功能当前cucumber支持多种语言,除了ruby还可以使用java、javas

cript来编写步骤层

3、Features介绍
feature(功能),每一个feature文件都要 开始于Feature(功能),Feature之后的描述可以随便写,知道出现Scenario(场景),一个feature中可以有多个 Scenario,每个Scenario包含(step)步骤列表,步骤使用Given、When、Then、But、And这些关键 词,cucumber对这些关键词的处理是一样的,但是我们在使用的时候需要按照场景区分。

4、Step denfinitions介绍

Cucumber中定义的每一个step(步骤)都需要有一个step definition对应,默认的话是使用Ruby来编写定义的脚本(现在有cucumber-js等也支持javascript、java等来编写),支持通过正则表达式从step中传递参数。Step definition的详细说明可以参考

https://github.com/cucumber/cucumber/wiki/Step-Definitions

5、Given When then(假如 当 那么)

Cucumber的步骤中会包含Given、When、then这些词组,cucumber本身在技术实现上不区分这三个词组,但是在使用上推荐按照词组的意思来使用。
Given-用例开始执行前的一个前置条件,类似与编写代码setup中的一些步骤
When-用例开始执行的一些关键操作步骤,类似点击元素等
Then-观察结果,就是平时用例中的验证步骤
And-一个步骤中如果存在多个Given操作,后面的Given可以用And替代
But-一个步骤中如果存在多个Then操作,第二个开始后面的Then可以用But替代

 

6、 Cucumber使用

6、cucumber使用

 

查看cucumber支持的语言 cucumber --i18n help

查看支持语言的关键字 cucumber –i18n zh-CN

创建Demo

1、 新建一个demo文件件

2、 demo文件夹下新建features文件夹

3、 features文件夹下新建”中文.feature”文件,后缀必须是.fearure结尾

中文的话最前面必须增加# language: zh-CN


# language: zh-CN

功能:第一个中文程序

中文实现

场景:中文实现场景

假如当前是中文

当输入是测试

那么能看到中文测试

 

 

4、 新建step_denfinitions文件夹

5、step_denfinitions中新建step_steps.rb文件编写步骤定义(这里默认使用Ruby编写)

Given /^当前是(.*)/ do |action|

 @action= action

end

When /^输入是(.*)/ do |subject| @subject = subject

end

Then /^能看到(.*)/ do |greeting|

  if greeting != "#{@action}#{@subject}"     raise "期望看到<" + greeting + ">,实际看到<" + "#{@action}#{@subject}>"

  end

end

 

 

 


6、 执行编写的脚本,在features文件夹的同一目录下运行cucumber命令,则会自动查找features额文件夹下的所有.features结尾的文件进行执行

7、如果按照tag执行,可以使用cucumber –tags @P0  则只执行P0优先级的用例

 

 

7、Cucumber-tags功能

 

详细介绍见:https://github.com/cucumber/cucumber/wiki/Tags


@billing

Feature: Verify billing    

@important   

Scenario: Missing product description

Scenario: Several products

对Feature或者Scenario都可以增加tag来进行标注,运行时可以选择只运行哪些tag
cucumber –tags @billing

 

 

8、Cucumber-Hooks功能

 

详细介绍见:https://github.com/cucumber/cucumber/wiki/Hooks

Cucumber提供了一些钩子,可以在cucumber的生命周期中调用,可以在support目录下新建文件自定义钩子中的一些处理。

比如下面的代码会在每一个场景的第一个step执行之前调用

Before do |scenario|  

        # The +scenario+ argument is optional, but if you use it, you can get the title,

        # description, or name (title + description) of the scenario that is about to be  

        # executed.  

        Rails.logger.debug "Starting scenario: #{scenario.title}"

end

9、Cucumber-Custom Formatters功能

 

 

详细介绍见:https://github.com/cucumber/cucumber/wiki/Custom-Formatters

在执行时增加format参数可以输出详细的结果,另外也可以编写自己的format

cucumber --format debug

当前也存在一些一直的format插件,可以把cucumber的运行结果转为html等格式,具体可以见介绍页的最后。

Cucumber –f html –out “test.html”会自动生成html的结果文件

10、Cucumber-Profiles功能

详细介绍见:https://github.com/cucumber/cucumber/wiki/Profiles

可以在当前的工作目录下新建config目录,下面新建cucmber.yml文件,可以在文件中定义一些组合的命令用于cucumber调用

# config/cucumber.yml

##YAML Template

---

html_report: --format progress --format html --out=features_report.html   bvt: --tags @bvt

定义完成后可以在cucumber中通过下面命令调用

cucumber –p bvt

cucumber –profile html_report

11、Running Features

运行编写好的Feartures,详细见:

https://github.com/cucumber/cucumber/wiki/Running-Features

cucumber -–help 查看命令的帮助
cucumber 默认运行features目录下面的所有feature
cucumber -–require features features/first.feature 只运行指定feature文件中的用例
cucumber features –name “hello” 运行指定Scenario名称的用例
cucumber features/first.feature:11 运行文件中指定行数对于的Scenario用例

12、持续集成结合

 

详细见:https://github.com/cucumber/cucumber/wiki/Continuous-Integration

cucumber支持运行时生成junit格式的xml结果文件,用于在Jenkins中自动来解析xml文件生成结果内容

cucumber –f junit –out “junit”

通过上面的命令可以执行所有的feature,每一个feature文件都会生成一个xml的结果文件,可以用于在和持续集成整合。

13、Cucumber-jvm

 

cucumber默认是使用Ruby来编写step_denfinitions中的步骤,但是一些测试工具是使用java或者javascript来编写的,比如selenium使用java,不要害怕,cucumber提供了很多不同语言的扩展,也支持java、javascript等。

 

Cucumber-jvm详细信息见:

https://github.com/cucumber/cucumber-jvm

 

使用流程:

1、 下载cucumber-jvm相关jar包

下载地址:https://oss.sonatype.org/content/repositories/releases/
cucumber-core.jar 核心包
cucumber-java.jar通过java编写需要下载这个包
cucumber-html.jar生成结果为html文件需要下载这个包
cucumber-junit.jar生成结果为junit格式需要这个包
junit.jar java代码中使用junit
jchronic.jar

2、eclipse中新建一个一般的java工程,引入下载的jar包
3、新建基于java的step_denfinitions文件,这里只需新建一般的java文件即可
下面是一个demo的例子

 

package com.netease.cucumber.java;

 

import junit.framework.Assert;

import cucumber.api.java.zh_cn.*;;

 

public class ChineseDemo {

    private String action;

    private String subject;

 

    @假如("^当前是(.*)")

    public void isChinese(String action){

       this.action = action;

    }

    @当("^输入是(.*)")

    public void input(String subject){

        this.subject = subject;

    }

 

    @那么("^能看到(.*)")

    public void outPut(String gretting){

        Assert.assertEquals(action + subject, gretting);

    }

}



编写完成上面的java文件后,就需要编写你的features文件了

# language: zh-CN
功能:第一个中文程序
中文实现

@P0
场景:中文实现场景
假如当前是中文
当输入是测试
那么能看到中文测试

运行用例

这里使用了官方提供的一个build文件来运行,支持通过命令行的方式,具体支持哪些参数官方也没有详细的文档,暂时只了解到下面一些

详细的build文件可以参考:

https://github.com/cucumber/cucumber-jvm/blob/master/examples/java-helloworld/build.xml

这里简单介绍一下具体运行的几个参数

<target name="runcukes" depends="compile-test">

        <mkdir dir="target/cucumber-junit-report"/>

        <!-- cucumber.api.cli.Main这里是cucumber-jvm的运行入口方法 -->

        <java classname="cucumber.api.cli.Main" fork="true" failοnerrοr="false" resultproperty="cucumber.exitstatus">

            <classpath refid="classpath"/>

            <!-- 这里参数是生成junit格式的xml文件,后续可以和ci平台整合 -->

            <arg value="--format"/>

            <arg value="junit:target/cucumber-junit-report.xml"/>

        

            <!-- 这里是生成一份html格式的结果报告 -->

            <arg value="--format"/>

            <arg value="html:target/cucumber-html-report"/>

            <!-- com.netease.cucumber.java这个包名下面定义了自己编写的step,features下面定义了详细的用例执行步骤 -->

            <arg value="--glue"/>

            <arg value="com.netease.cucumber.java"/>

             <arg value="features/"/>

             <!-- 按照tags选择需要运行的用例 -->

             <arg value="--tags"/>

            <arg value="@P0"/>

        </java>

转载于:https://www.cnblogs.com/digod/p/9895772.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/412942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle修改字段的顺序

一&#xff1a;简单粗暴 1,Oracle: create table CFORM_COULUMN_2 as &#xff08;select 字段A,字段B from CFORM_COULUMN);2,Sqlserver select 字段A,字段B.... into CFORM_COULUMN_2 from CFORM_COULUMN二&#xff1a;通过SYS数据库更新字段顺序 1&#xff0c;查询表…

[css] 怎么去掉点击a链接或者图片出现的边框?

[css] 怎么去掉点击a链接或者图片出现的边框&#xff1f; a{text-decoration:none} img{border:0 none}个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

springboot 2.x tomcat war包部署 localhost-startStop-1 启动卡顿卡死

大家好&#xff0c;我是烤鸭&#xff1a; 关于springboot war包部署tomcat。环境&#xff1a;springboot 2.0.3.RELEASEapache-tomcat-8.5.321. 修改pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns:xsi"http://www.w3.org…

高可用Eureka注册中心配置说明(双机部署)

目 录 1. 高可用EureKa注册中心示意图 2. Eureka实例相互注册配置 3. 微服务注册到Eureka配置 4. 启动步骤及配置成功检查 5. 说明事项 1. 高可用EureKa注册中心示意图 Spring Cloud的Eureka Server的高可用实际上就是将自己作为服务向其他服注册中心注册自己&#xff0c;形成…

sql 把特定数据排在最前面

第一法】 select * from table where nameD UNION ALL select * from table where name<>D 第二法】SELECT CASE WHEN [name]D THEN 0 ELSE 1 END FLAG,* FROM TABLE order by flag asc

[css] css的linear-gradient有什么作用呢?

[css] css的linear-gradient有什么作用呢&#xff1f; 概念&#xff1a;线性渐变,向下/向上/向左/向右/对角方向,为了创建一个线性渐变&#xff0c;你必须至少定义两种颜色结点。颜色结点即你想要呈现平稳过渡的颜色。同时&#xff0c;你也可以设置一个起点和一个方向&#xff…

elasticsearch 6.x (四) 单一文档 API 介绍和使用 index和get API

大家好&#xff0c;我是烤鸭&#xff1a;今天分享的是官网6.x 单一文档(Single document APIs)APIs。本文这是部分翻译&#xff0c;如果想看全部的&#xff0c;还是建议阅读官方api。链接&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/current/docs…

Dockerfile语法

Dockerfile 语法示例 Dockerfile语法由两部分构成&#xff0c;注释和命令参数 # Line blocks used for commentingcommand argument argument ..一个简单的例子&#xff1a; # Print "Hello docker!"RUN echo "Hello docker!"Dockerfile 命令 Dockerfile有…

[css] 会引起Reflow和Repaint的操作有哪些?

[css] 会引起Reflow和Repaint的操作有哪些&#xff1f; 页面布局和几何信息(比如&#xff1a;增加删除dom&#xff0c;改变元素位置或者尺寸等)发生改变时&#xff0c;会触发Reflow。 给dom节点添加样式&#xff0c;会触发Repaint。 触发Reflow一定会引起Repaint&#xff0c;触…

Centos7离线安装Mysql8

一&#xff0c;下载tar包 1&#xff0c;直接下载&#xff1a;https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.15-1.el7.x86_64.rpm-bundle.tar 2&#xff0c;百度网盘&#xff1a;https://pan.baidu.com/s/1V180rx0FVFuUOrnPMqrVpQ 提取码&#xff1a;08jx 二&…

[css] 你有用过clip-path吗?说说你对它的理解和它都有哪些运用场景?

[css] 你有用过clip-path吗&#xff1f;说说你对它的理解和它都有哪些运用场景&#xff1f; clip-path属性可以创建一个只有元素的部分区域可以显示的剪切区域它的值可以为以下几种: 用 表示剪切元素的路径: 一种形状&#xff0c;其大小和位置由<几何盒>值定义。如果没有…

elasticsearch 6.x (五) 单一文档 API 介绍和使用 update和delete API

大家好&#xff0c;我是烤鸭&#xff1a;今天分享的是官网6.x 单一文档(Single document APIs)APIs。本文这是部分翻译&#xff0c;如果想看全部的&#xff0c;还是建议阅读官方api。链接&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/current/docs…

Linux 编译安装BIND

下载网址&#xff1a;www.isc.org 首选需要安装开发环境&#xff0c;包括openssl等开发包&#xff1b; 解压文件 tar -zxvf bind*.tar.gz 创建named使用的系统用户 groupadd -g 53 -r named useradd -u 53 -r named 编译安装 …

Mysql设置忽略大小写

如果你不在意数据的话直接删除数据&#xff08;删数据库前请备份&#xff09; 1 停止MySQL 2 删除 MySQL的数据 /var/lib/mysql 3 修改该 lower_case_table_names 1 4 启动 mysql 4 搞定 解决Navicat连接MySQL出现1251-Client does not support authentication protocol requ…

[css] 你是怎么选择resetting和normalizing的?为什么?

[css] 你是怎么选择resetting和normalizing的&#xff1f;为什么&#xff1f; 一般选择normalizeReset: 比较粗暴的处理方式&#xff0c;不管有用没有统统处理成一种方式&#xff0c;如果是临时页面会采用。* {margin: 0;padding: 0;box-sizing: border-box; } *::after, *::be…

http://www.a.cn/?a.b=1 取a.b的值

$_GET[a_b] 转载于:https://www.cnblogs.com/liiu/p/9909286.html

解决svn:E200030: sqlite[S11]:database disk image is malformed

一&#xff0c;问题产生原因&#xff1a;我的电脑突然蓝屏&#xff0c;然后重启电脑后&#xff0c;更新项目提示这个鬼东西 二&#xff0c;解决方法&#xff1a; 1&#xff0c;下载sqlite3并把sqlite3.exe放到项目文件夹.svn同级目录 2&#xff0c;在项目文件夹的上面路径那里…

Java 正则表达式 工具类 中文 英文 email 手机号 身份证 数字 日期

大家好&#xff0c;我是烤鸭&#xff1a; 分享一个Java版本的正则校验工具类。 Validation.java package com.xxx.xxx.common.utils;import java.util.regex.Matcher; import java.util.regex.Pattern; /*** 验证工具类* author admin**/ public class Validation { //--…

[css] position跟margin collapse这些特性相互叠加后会怎么样?

[css] position跟margin collapse这些特性相互叠加后会怎么样&#xff1f; 怎样防止外边距重叠&#xff1f;底部元素脱离文档流(float: left/right || position: absolute/fixed)个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一…

Python_全局变量的定义

1.在my套件下新建一个关键字systemkey并进行脚本的编写&#xff1a;创建一个${var1}变量&#xff0c;并赋值为aaaaaaaaaa Set Global Variable ${var1} aaaaaaaaaa 2.在全局&#xff08;最顶部文件夹&#xff09;中Suite Setup→Edit→systemkey&#xff08…