一、簡介
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文件