自動化測試之cucumber.md

一、簡介

cucumber是BDD(Behavior-driven development,行爲驅動開發)的一個自動化測試的副產品。它使用自然語言來描述測試,使得非程序員可以理解他們。Gherkin是這種自然語言測試的簡單語法,而Cucumber是可以執行它們的工具。關於BDD有興趣自行了解。附cucumber官網鏈接,裏面也有關於BDD的信息。
cucumber本質上是使用根據正則表達式匹配自然語言,然後依次執行對應的方法,以達到測試的目的。

二、安裝

cucumber支持JDK8,創建一個mvn工程,在pom.xml文件引入以下依賴即可。
另外如果測試框架採用的是junit,則需要多一個cucumber-junit。
如果集成spring,則還需要引入cucumber-spring
   <dependency>
        <groupId>info.cukes</groupId>
        <artifactId>cucumber-java</artifactId>
        <version>1.2.4</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>info.cukes</groupId>
        <artifactId>cucumber-junit</artifactId>
        <version>1.2.4</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>info.cukes</groupId>
        <artifactId>cucumber-spring</artifactId>
        <version>1.2.4</version>
        <scope>test</scope>
    </dependency>
也可以根據mvn骨架創建cucumber項目。打開終端,轉到要創建項目的目錄(比如本文是hellocucumber),運行以下命令
   mvn archetype:generate                  
  -DarchetypeGroupId=io.cucumber           
  -DarchetypeArtifactId=cucumber-archetype 
  -DarchetypeVersion=2.3.1.2               
  -DgroupId=hellocucumber                  
  -DartifactId=hellocucumber              
  -Dpackage=hellocucumber                  
  -Dversion=1.0.0-SNAPSHOT                 
  -DinteractiveMode=false
應該得到如下結果:
    [INFO] Project created from Archetype in dir:   hellocucumber/cucumber
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
但是不支持jdk8 U51之後的新版本!每次都報錯說"Wrong type at constant pool index"。

三、基本語法

3.1 Gherkin

Cucumber 執行 .feature 文件,而這些文件包含可執行的規範,用被稱爲 Gherkin 的語言寫成。.featur文件一般放在src/test/resources/[項目名稱xxx]目錄下或者其子目錄下。

Gherkin 是帶有一點額外結構的純文本的英文(或者替他60多種語言). Gherkin 設計爲容易被非編程人員學習,但有足夠的組織結構來容許簡潔的範例描述,以說明大多數實際領域中的業務規則。
下面是一個簡單的.feature 文件的例子
    Feature: Refund item

    Scenario: Jeff returns a faulty microwave
        Given Jeff has bought a microwave for $100
        And he has a receipt
        When he returns the microwave
        Then Jeff should be refunded $100
在 Gherkin 中, 每行必須以 Gherkin 關鍵字開頭, 然後跟隨有任意的文本。主要的關鍵字有:
  • Feature / 特性

  • Scenario / 場景

  • Given, When, Then, And, But (Steps/步驟)

  • Background / 背景

  • Scenario Outline / 場景大綱

  • Examples / 示例

    還有其他一些額外的關鍵字:

  • “”" (Doc Strings)

  • | (Data Tables)

  • @ (Tags)

  • # Comments


3.2 Feature / 特性

.feature 文件用來描述系統的一個單一特性,或者某個特性的一個獨特方面。這僅僅是一個提供軟件特性的高級描述的方法,並用於組織相關的場景(scenarios)。
feature有三個基本元素:
1.Feature: 關鍵字
2.name: 名稱, 在同一行
3.description:描述, 可選(但是強烈推薦),可以佔據多行   
例如:
Feature: Refund item

  Sales assistants should be able to refund customers' purchases.
  This is required by the law, and is also essential in order to
  keep customers happy.

  Rules:
  - Customer must present proof of purchase
  - Purchase must be less than 30 days ago

3.3 Scenario / 場景

Scenario 是具體的實例,描述一個業務規則。它由步驟列表組成。
可以有任意多個步驟,但是推薦數量保持在每個場景3-5個步驟。如果太長,他們將喪失作爲規範和文檔的表單能力。
在作爲規範和文檔之外,場景也同樣是測試。作爲一個整體,場景是系統的可執行規範。
場景遵循同樣的模式:
1、 描述一個初始化上下文
2、 描述一個時間
3、 描述一個期望的產出

3.4 Steps / 步驟

步驟通常以 Given, When 或 Then 開頭。如果有多個 Given 或者 When 步驟連在一
起,可以使用 And 或者 But。Cucumber不區分這些關鍵字,但是選擇正確的關鍵字對於
場景整體的可讀性很重要。

3.5 Given / 假設

Given 步驟用於描述系統的初始化上下文 - 場景的一幕(scene of Scenario)。它通常是某些已經發生在過去的東西。
當cucumber執行 Given 步驟時,它將配置系統到一個定義良好的狀態,例如創建並配置對象或者添加數據到測試數據庫。
可以有多個 Given 步驟(可以使用 And 或者 But 來變的更可讀)

3.6 Then / 那麼

Then 步驟用於描述期望的產出,或者結果。
Then 步驟的 步驟定義 應該使用斷言來比較實際產出(系統實際行爲)和期待產出(步驟所述的系統應有的行爲)

3.7 Background / 背景

發現一個feature文件中的所有場景都在重複同樣的 Given 步驟。既然它在每個場景
可以將這樣的 Given 步驟移動到background中,在第一個場景之前,用一個 Background 塊組織他們:
    Background:
      Given a $100 microwave was sold on 2015-11-03
      And today is 2015-11-18

3.8 Scenario Outline / 場景大綱

當有複雜業務規則,帶有多個輸入或者輸出,可以最終創建僅僅是值有差別的多個場景。舉個例子:
    Scenario: feeding a small suckler cow
        Given the cow weighs 450 kg
        When we calculate the feeding requirements
        Then the energy should be 26500 MJ
        And the protein should be 215 kg

    Scenario: feeding a medium suckler cow
        Given the cow weighs 500 kg
        When we calculate the feeding requirements
        Then the energy should be 29500 MJ
        And the protein should be 245 kg

    # 還有兩個例子 --- 已經令人厭煩了
如果有很多例子,將會很乏味。可以通過使用場景大綱來簡化:
    Scenario Outline: feeding a suckler cow
        Given the cow weighs <weight> kg
        When we calculate the feeding requirements
        Then the energy should be <energy> MJ
        And the protein should be <protein> kg

        Examples:
            | weight | energy | protein |
            |    450 |  26500 |     215 |
            |    500 |  29500 |     245 |
            |    575 |  31500 |     255 |
            |    600 |  37000 |     305 |
這更易於閱讀。場景大綱步驟中的變量通過使用 < 和 > 來標記。

3.9 Examples / 示例

場景大綱部分總被帶有一個或者多個 Examples / 示例 部分,用於包含一個表格。
表格必須有header 行,對應場景大綱步驟中的變量。
下面的每一行將創建一個新的場景,使用變量的值填充。

3.10 執行步驟

當cucumber執行場景中的步驟時,它將查找匹配的步驟定義來執行。
步驟定義是帶有正則表達式的小段代碼。正則表達式用於連接步驟定義到所有匹配的步驟,而代碼是cucumber要執行的內容。
例如一下場景:
    Scenario: Some cukes
        Given I have 48 cukes in my belly
步驟的 I have 48 cukes in my belly 部分(Given關鍵字後面的文本)將匹配下面的步驟定義:
    @Given("I have (\\d+) cukes in my belly")
    public void I_have_cukes_in_my_belly(int cukes){
        System.out.format("Cukes: %n\n", cukes);
    }
當cucumber匹配步驟到一個步驟定義中的正則表達式時,它傳遞所有捕獲組(capture group)的值到步驟定義的參數。捕獲組是字符串(即使他們匹配數字如 \d+ )。對於靜態類型語言,cucumber將自動轉換這些字符串到合適的類型。對於動態類型語言,默認不轉換,因爲他們沒有類型信息。
Cucumber不區分這五個步驟關鍵字 Given, When, Then, And 和 But。

四、實踐

4.1編寫.feature文件

在這裏插入圖片描述
.features文件一般放在test/resources/features目錄下。
圖中使用的是中文來編寫的,這樣寫的前提是在首行加上 # language: zh-CN
一個場景爲一個執行單位,一般用於測試一個接口。每個步驟都會通過正則匹配一個方法。
步驟寫好後,鼠標點擊黃色色塊上,按下自動提示快捷鍵,編譯器會提示定義step。按提示創建即可。

4.2編寫步驟steps類

如下圖:

在這裏插入圖片描述
圖中@cucumber.api.java.zh_CN報紅,只要將cucumber.api.java.zh_CN刪除,重新導入即可。或者將CN改爲小寫的cn。
steps類一般放在test/java/項目包名/目錄下的一個文件夾中。
每個方法中編寫測試代碼,去測試某個接口。接口的訪問可以使用RestTemplate。使用Assert判斷接口返回是否與預期的一樣。

一個完整的場景,包括以下幾個步驟:
1、新建測試數據
2、調用接口進行測試
3、刪除測試數據
這樣可以重複測試,不會產生多餘的測試數據。

4.3 啓動測試

啓動測試有兩種方法,
1、右鍵.feature文件,選擇Debug Feature執行
2、如下圖,編寫測試類去啓動@CucumberOptions註解的features屬性對應.feature文件

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章