1. 使用pytest完成接口自動化
1.1. pytest 簡介
pytest 是 Python 的一款開源測試框架。
主要特點:
- 簡單靈活,文檔豐富;
- 能夠支持單元測試、功能測試、接口自動化測試等;
- 具有衆多第三方插件,且可以自定義擴展;
- 支持參數化,可控制測試用例的粒度;
- 可以很好的和 CI 工具結合,例如 Jenkins 。
1.2. 使用參考
1.2.1. 命名約束
- 測試文件以"test_"開頭/以"_test"結尾
- 測試類以"Test"開頭,並且不能帶有
__init__
方法 - 測試函數以"test_"開頭
默認情況下,pytest 查找當前目錄下所有以 test 開始或結尾的 Python 腳本,並執行文件內的所有以 test 開始的函數和方法。
1.2.2. 運行
在終端按需輸入以下命令來運行 case:
- 運行所有 case :pytest
- 運行指定 case :pytest testCase/test_demo1.py
- 運行關鍵字匹配的 case :pytest -k “表達式”
- 運行標記匹配的 case :pytest -m "標記"
- 運行後控制檯展示詳細信息:pytest -v
- ...
1.2.3. 斷言assert
pytest 中可以使用 Python 原生的斷言語句 assert 來進行驗證。
常用:
- assert xx:判斷 xx 爲真
- assert not xx:判斷 xx 不爲真
- assert a in b:判斷 b 包含 a
- assert a == b:判斷 a 等於 b
- assert a !=b:判斷 a 不等於 b
可以指定斷言失敗的返回信息,舉例如下:
assert response["result_code"] == expected["response"]["result_code"], "實際的返回結果是:{}".format(response["result_code"])
1.2.4. fixture
fixture 是 pytest 特有功能,目的是提供一種手段去運行最基本的、重複的測試內容,是將測試前後的預備工作、清理工作的代碼分離出核心測試邏輯的一種機制。通常用來對測試方法、測試函數、測試類和整個測試文件進行初始化或還原測試環境。
@pytest.fixture(scope="function", params=None, autouse=False, ids=None, name=None)
-
scope:作用域,(
function:方法,默認爲function
class:類
module:.py文件
session:會話)
- params:可選的參數列表,可使多個參數調用fixture功能
- autouse:是否默認調用該fixture,默認爲False
- ids:每個字符串id的列表
-
name:裝飾器名字
1.2.4.1. fixture 作爲函數參數
可以通過使用 @pytest.fixture 註冊成爲一個 fixture 函數,來爲測試方法提供一個 fixture 對象。
如下圖所示,connect_mysql_uds 函數被註冊成了一個 fixture 函數,在 test_query_couplist 方法中可以直接被作爲參數使用。
1.2.4.2. 在 conftest.py 中管理 fixture
如果多個文件都需要用到這個fixture函數,則可以將該函數放到conftest.py文件中管理,所需的 fixture 對象會自動被 pytest 發現。
1.2.4.3. 執行順序
較高範圍的 fixture(例如session會話級)比低範圍的 fixture(例如function函數級或class類級)優先執行。
相同範圍的 fixture 對象的按引入的順序或依賴關係按順序調用。
1.2.4.4. yield
yield 語句之後的所有代碼都視爲 teardown 代碼。
舉例,如下圖所示,整個會話結束後,會打印出”關閉數據庫”的語句。
1.2.5. mark
1.2.5.1. 標記和分類用例
@pytest.mark.level
用法步驟:
a. 先在 pytest.ini 文件中對標籤進行註冊
b. 對用例進行標記
c. 運行指定標記的用例
在終端輸入: pytest -m "P0"
1.2.5.2. 標記跳過用例
無條件跳過:@pytest.mark.skip(reason="跳過原因描述")
在指定條件下跳過:@pytest.mark.skipif(condition, reason="跳過原因描述")
1.2.5.3. 標記用例爲預期失敗
@pytest.mark.xfail(reason="預期失敗描述")
對於功能未完成或已知有問題的用例,可以用 xfail 標記,這樣即使斷言失敗,也不會影響其他測試用例的的執行。
執行 case 後,控制檯中顯示:
- XFAIL:表示預期失敗,實際也失敗
- XPASS:表示預期失敗,實際運行沒有失敗
1.2.5.4. 參數化
我們進行接口測試時,往往很多時候操作步驟都是一樣的,只有數據不一樣,這時候就可以使用參數化功能,來減少代碼冗餘。
@pytest.mark.parametrize(argnames, argvalues, ids=None)
- argnames:參數名稱,字符串格式
- argvalues:參數值列表,列表格式
- ids:用例的 ID ,字符串列表格式
舉例,如下圖所示,裝飾器會自動對 list_params 解包並賦值給裝飾器的第一參數。裝飾器的第一個參數中逗號分隔的變量可以作爲測試方法的參數,在測試方法內就可以直接獲取這些變量的值。
1.2.6. Allure
Allure 是一種靈活、輕量級、多語言的測試報告工具,以簡潔精美的 web 報告形式展示。
Python 中有一個第三方庫:allure-pytest,用於連接 pytest 和 allure ,使它們可以更好的配合使用。
Allure的常用用法:
使用方法 |
說明 |
---|---|
@allure.epic() | 描述史詩,即未拆解的story |
@allure.feature() | 描述功能模塊 |
@allure.story() | 描述用戶故事 |
@allure.title() | 描述用例標題 |
@allure.step() | 描述用例步驟 |
@allure.severity() | 描述用例等級:blocker,critical,normal,minor,trivial |
報告的主要頁面介紹:
- Graphs
該頁面展示本次執行結果的統計信息,比如執行結果成功失敗比例、測試用例等級分佈、用例執行時間等。
- Behaviors
該頁面根據代碼中設定的 @allure.feature()、@allure.story() 等來展示用例執行的結果,這裏可以看到用例執行的詳細信息。