接口自動化測試-pytest框架

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() 等來展示用例執行的結果,這裏可以看到用例執行的詳細信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章