1. 程式人生 > >第一章——自動化測試框架總結Cucumber

第一章——自動化測試框架總結Cucumber


 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" failonerror="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 入門一

https://blog.csdn.net/jackiej/article/details/8618208

一分鐘認識:Cucumber框架(一)

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

Cucumber

https://blog.csdn.net/liangliang103377/article/details/49928279/