0
点赞
收藏
分享

微信扫一扫

第一章——自动化测试框架总结Cucumber

i奇异 2022-09-12 阅读 25


 ​​cucumber​​​官网地址:​​https://cucumber.io/​​

1. 什么是BDD

​​BDD​​​全称Behavior Driven Development,译作"​​行为驱动开发​​​",是基于​​TDD​​ (Test Driven Development 测试驱动开发)的软件开发过程和方法。

​​BDD​​可以让项目成员(甚至是不懂编程的)使用自然语言来描述系统功能和场景,从而根据这些描述步骤进行系统自动化的测试。

2. 常用BDD框架介绍

目前常用的BDD测试框架有Ruby中的Cucumber,​​Python​​中的Behave、Lettuce及Freshen等。

简单来说就是"写用例->跑测试->看结果->写实现->看结果"这样的一个循环。

2.1 Cucumber介绍

2.1.1 Cucumber是什么 

Cucumber是一个在敏捷团队十分流行的自动化的功能测试工具,但是其不仅仅是一个测试工具,它能够为我们建立一个易读的,可执行的特性文档。

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

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

2.1.2 Features介绍

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

2.1.3 Step denfinitions介绍

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

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

​​https://docs.cucumber.io/cucumber/step-definitions/​​

2.1.4 Given When then(假如 当 那么)

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

2.1.5 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优先级的用例

2.1.6 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

2.1.7 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

2.1.8 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的结果文件 

2.1.9 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

2.1.10 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用例

2.1.11 持续集成结合

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

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

cucumber –f junit –out “junit”

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

2.1.12 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.*;;



publicclass ChineseDemo {

private String action;

private String subject;



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

publicvoid isChinese(Stringaction){

this.action = action;

}

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

publicvoid input(Stringsubject){

this.subject = subject;

}



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

publicvoid outPut(Stringgretting){

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>

2.1.2 Cucumber的特点 

(1)易于安装,使用。无论是在Ruby平台,.Net平台,Java平台安装都很容易。 
(2)集成度高,对开发环境没有破坏,并和多种Web开发框架集成。 
(3)易于理解,Cucumber的特性文档都是采用近似于普通文本的语法写成,很容易读懂和编写,甚至是非技术人员都可以编写。 
(4)易于维护,因Cucumber是从用户的业务逻辑出发去写测试,不涉及到具体的技术框架,和内部业务流程,因为业务逻辑的变动频率相教于技术选择,内部处理流程稳定得多,测试被破坏的概率就低很多。 

2.1.3 Cucumber 第一个Demo 

(1)a、安装Ruby,

         b、通过命令gem install cucumber安装Cucumber,

         c、安装Rspec,命令”gem install rspec“(因为Cucumber还使用了Rspec作Assertion)

         (在过程中,若出现ERROR:  Error installing cucumber:cucumber requires gherkin (~> 2.2.9,runtime)的错误,是因为Cucumber依赖的一个gem,gherkin有老版本。可通过gem install gherkin --version,指定安装新版本解决。或者gem uninstall gherkin,gem install gherkin重新安装)。

(2)创建一个Ruby project,然后在其项目目录下创建一个features的目录,在features目录下创建basic.feature的文件,其中的内容如下:

Feature: Hello World Feature
In order to ensure that my installation works
As a Developer
I want to run a quick Cucumber test

Scenario: Hello World Scenario
Given The Action is Hello
When The Subject is World
Then The Greeting is Hello, World

(3)在features目录下创建step_definitions目录,在step_definitions目录下创建step_steps.rb文件,内容如下:

require 'rspec/expectations'

Given /The Action is ([A-z]*)/ do |action|
@action = action
end

When /The Subject is ([A-z]*)/ do |subject|
@subject = subject
end

Then /The Greeting is (.*)/ do |greeting|
greeting.should == "#{@action}, #{@subject}"
end

(4)在项目根目录下执行cucumber,可以得到如下结果:

 (这里作者没写,等我会搞清楚了给补上)

2.1.4 Cucumber的术语 

支持中、英等自然语言,是Cucumber的特点之一。在Cucumber的帮助文档里,声明它支持包括简体中文、繁体中文、日文、韩文和英文在内的45种语言。

Cucumber三大组成:Features、Step_definitions、Cucumber command。

Cucumber关键字含义与原有自动化测试工具中的概念相同,类比如下:

Cucumber

Unit Test

Feature (功能)

test suite (测试用例集)

Scenario(情景)

test case (测试用例)

Given(给定)

setup(创建测试所需环境)

When(当)

test(触发被测事件)

Then(则)

assert(断言,验证结果)

(1)Feature File:该文件通过一些具有代表性的例子来描述一个用户需求, 
(2)Key Examples:关键用例,特性之间都可以通过自己的关键用例加以区分,每个关键用例都有明确的输入和输出。 
(3)Scenario:测试场景,一个用户特性的一个关键用例就称之为一个测试场景。 
(4)Step:测试步骤,一个测试场景涉及到多个步骤操作, 
(5)Step_Definitions:步骤定义,用来定义测试用例中步骤的执行顺序。 
(6)Gherkin:用来定义Feature File的结构和关键字含义的语言,可以通过这个语言在未支持cucumber的平台上实现一个cucumber。

2.2 Cucumber..

2.2.1 Features

  • 语法规则:
  • 基于Gherkin。支持语言:# language: en (zh-CN)等
  • Features文件必须以.features命名。
  • 包含title,多个scenarios,每个scenario包含多个step。
  • Step定义必须以关键字Given,When,Then,And开始

2.2.2 Step_definitions

 

参考资料:

Python BDD自动化测试框架初探:

​​http://lovesoo.org/python-bdd-exploration-of-the-automated-testing-framework.html​​

​​ucumber 入门学习​​:

​​http://ningandjiao.iteye.com/blog/1483894​​

Cucumber 入门一


一分钟认识:Cucumber框架(一)

​​https://www.jianshu.com/p/b934ce61c9dc​​

Cucumber


 

举报

相关推荐

0 条评论