一款使用 MarkDown 描述的自動化神器 Gauge
01 什麼是 Gauge
Gauge 是一款用於編寫和運行驗收測試的 BDD 框架,它有如下的特點:
-
使用 Markdown 的簡單、靈活的語法來描述行爲
-
支持多平臺(Windows、Linux、macOS)、多語言 (C#、Java、Javascript、Python、Ruby)
-
支持插件擴展
-
支持數據驅動和外部數據源(CSV 文件)
-
支持 VS Code
其中使用 Markdown 語法描述行爲,算是 Gauge 最特殊的地方了,接下來我們將對其做一詳細的說明,包括環境準備、項目初始化、用例編寫、數據驅動、運行、測試報告等。
02 環境準備
1. 安裝 Python
python 安裝比較簡單,這裏不做敘述。唯一需要注意的是要求 python 版本 >=2.7
2. 下載 gauge-1.1.1-windows.x86_64.exe
下載地址:https://github.com/getgauge/gauge/releases
安裝比較簡單,一路點擊下一步,最後將 gauge.exe 所在路徑配置環境變量。在 cmder 中輸入 gauge -v,有輸出版本信息時,說明已經安裝成功
3. 安裝 VS Code 插件
在 VS Code 裏安裝 gauge 插件
03 項目初始化
在 E 盤的 virtual_workshop 目錄下,創建一個 gauge_study 的項目目錄,切換到該目錄,使用命令 gauge init python 初始化項目
初始化做了一些目錄分層、環境配置等工作,並且給出了一個樣例 (見 example.spec、step_iml.py),這是一個關於英語單詞中元音字母統計的項目
下面解釋一下各個目錄的作用:
-
env:環境配置目錄
-
logs:日誌目錄
-
specs:描述行爲的目錄,這裏存放的 spec 文件,使用 MarkDown 語法編寫
-
step_impl:實現目錄,使用 python 或其他語言來執行 spec 文件中描述的行爲
04 用例編寫
1、編寫描述文件
既然是行爲驅動,肯定是先有行爲的描述,再有行爲的實現。因此如何編寫 spec 文件來描述行爲,如何實現這些行爲至關重要。現在有一個需求是這樣的:
在 specs 目錄下,創建一個 name.spec 的描述文件,使用 MarkDown 的語法來實現是這樣的
首先解釋一下編寫描述文件的規則:
在以往的測試用例中,都有測試套件、測試集合、測試場景、測試步驟的概念,這個概念同樣適用於 Gauge。你可以把 Specs 目錄理解爲測試套件,它下面的每一個 spec 文件都是一個測試集合,每個測試集合裏包含着一個或多個測試場景,每個測試場景中又包含着一個或多個測試步驟。這樣理解的話,很多東西一目瞭然
接着,我們結合例子具體講下描述文件 spec 文件的基本寫法
(1) 測試集合 Spec
spec 文件開始的標誌,只能有一個。每個 Spec 至少包含一個測試場景 Scenario,具體寫法是 "# 描述 ",當然下面也可以加上註釋。
- 這個主要描述了測試的功能模塊,比如姓名功能
# Name
This is a spec file that describe name type and length
(2) 測試場景 Scenario
每個 Scenario 至少包含了一個測試步驟 Step,具體的寫法是 "## 描述 "。
- 這個主要描述了測試場景,比如要測試姓名的類型、長度,是對功能模塊的分解
## Test name type
* The type of "Beck" must be "string"
(3) 測試步驟 Step
測試步驟裏可以包含測試數據 "Beck"和期望結果"string",也可以不包含,具體的寫法是"* 描述 "
- 每個步驟是對測試場景的分解
## Test name type
* The type of "Beck" must be "string"
2、編寫實現方法
描述文件準備好後,需要有語言的實現,描述文件和實現方法的關係,簡單歸納一下是這樣的:
如上圖所示,每一個測試方法都是對測試步驟描述的實現,只需要定義一個方法,就可以實現這個步驟。但問題來了,對於有測試數據和期望結果的步驟,我們應該怎麼表示?
- 很簡單,所有的實參的位置都用 <變量名> 表示即可,步驟只負責描述,具體獲取數據、處理數據、提取實際結果、斷言等邏輯由測試方法來實現,這裏有些數據分離的感覺了
基於這一思路,在 step_impl 目錄下創建一個 name_impl.py 模塊,接着從 getgauge.python 模塊中引入 step 方法,然後編寫測試方法 test_name_type 和 test_name_length,在測試方法上面加上 @step 裝飾器,裝飾器裏的參數是描述裏的內容,只不過使用 <參數名> 做了參數化,裝飾器裏的參數可以傳遞給測試方法
05 數據驅動
假設我們要對多個姓名做測試,顯然寫一行一行的步驟描述,定義一個一個的測試方法是不現實的,因此需要用到數據驅動。Gauge 裏支持表格和 csv 文件,我們先來看看錶格:
01 表格
需要在描述文件 name.spec 中定義表格。表格作爲步驟來看待,需要先準備好對應的場景和步驟
在 name.spec 中實現表格批量遍歷的方法 test_all_names_by_table,給它加上裝飾器 @step(),裝飾器的參數同樣是描述步驟中的內容 "All names that have type and length",只不過還要在後面加上變量 ,變量 table 表示表格對象,因此參數是 "All names that have type and length "
那麼表格中的每一個值怎麼遍歷呢?
使用 table.get_column_values_with_name(列名),可以得到對應列的每個值組成的可迭代對象,然後使用 for 循環依次遍歷
02 CSV 文件
在 gauge_study 項目下新建一個 resources 目錄,**用來存放 csv 文件,**可以定義一個 names.csv 文件,存放我們的測試數據
接着在描述文件 name.spec 中添加描述,和表格一樣要**設置場景和步驟,**然後需要在步驟描述里加一個 csv 文件地址的引用 table:resources/names.csv
最後在 name_impl.py 中實現 csv 數據的描述步驟,創建一個方法 test_all_names_by_csv_file,加裝飾器 @step,參數就是描述的一部分 "All names that supply by "。
這裏需要注意的是:
table 表示 csv 對象,對 table 進行遍歷得到的是每一行的數據,比如第一行的 ["Beck", "string", "4"],將這個可迭代對象的元素進行分解,依次賦值給 name, type, length,就拿到了 csv 文件中的每一個值
06 運行
到此爲止,我們自己寫了 4 條用例,一起來總結下:
怎麼運行這些用例?
- gauge 提供了很多方法,包括:批量運行所有的 spec 文件,運行特定的 spec 文件,運行特定的 spec 文件下特定的 scenario
1、運行所有的 spec 文件
方法:gauge run
或 gauge run specs
爲什麼這裏有 6 條用例呢?
因爲它把官方的樣例也運行了,所以多了 2 條出來
2、運行特定的 spec 文件
如果只想運行 name.spec 下的 4 條用例,需要加上指定的 spec 文件名
方法:gauge run specs/name.spec
可以看到只運行了 4 條用例
3、運行特定的 spec 文件下的特定的 scenario
name.spec 下有個 4 個場景,對應 4 個用例,如果此時只想運行其中一個場景,比如說讀取表格數據的那個場景,這時候應該怎麼寫呢?
方法:gauge run specs/name.spec:13
這個 13 是什麼?
實際上是 name.spec 文件中對應場景的行號
可以看到,只運行了一個場景 Test multiple names by table
07 測試報告
運行之後,會自動生成一個 reports 目錄,index.html 就是最終的測試報告,其相對路徑是:reports/html-report/index.html
使用瀏覽器打開報告,感覺 "顏值" 還可以,這裏都運行成功了。怎麼樣?這樣方便快捷的 BDD 自動化測試框架你不打算試一下?
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/ycvtZF7JgG7lwsYyAYLwMA