第一章——自動化測試框架總結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
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/