一款使用 MarkDown 描述的自動化神器 Gauge

01 什麼是 Gauge

Gauge 是一款用於編寫和運行驗收測試的 BDD 框架,它有如下的特點:

其中使用 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),這是一個關於英語單詞中元音字母統計的項目

下面解釋一下各個目錄的作用:

04 用例編寫

1、編寫描述文件

既然是行爲驅動,肯定是先有行爲的描述,再有行爲的實現。因此如何編寫 spec 文件來描述行爲,如何實現這些行爲至關重要。現在有一個需求是這樣的:

fiYiny

在 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 條用例,一起來總結下:

biyXJP

怎麼運行這些用例?

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