推薦兩款HTTP請求Mock利器

狂师發表於2024-04-15

1、背景

在日常測試過程中或者研發開發過程中,目前介面暫時沒有開發完成,測試人員又要提前介入介面測試中,測試人員不僅僅只是簡單的編寫測試用例,也可以透過一些mock的方法進行來提前根據介面測試的情況進行模擬返回介面的資訊,進行模擬介面各種場景的異常。

mock是指模擬,也就是模擬介面返回的資訊,用已有的資訊替換它需要返回的資訊,從實現對所依賴的模組的測試。

一般有兩種場景:

  • 前端對後端介面的 mock,
  • 後端服務之間的測試中涉及的mock,常常發生在單元測試的時候。

前端mock可以透過一些工具來完成:

  • 使用抓包工具Fiddler,Charles 來實現,透過修改代理返回的資料,實現多種場景的測試。
  • 使用一些API管理工具來模擬,比如yapi,Easy Mock 等
  • 當然有編碼能力的,也可以使用node.js,python的fastAPI來模擬

後端的 Mock 則是從介面的角度,如果一個介面A返回的資料需要依賴於另一個介面B,當敏捷開發中B介面還未開發完全時候這裡會需要用到 Mock。

對於測試人員,對介面測試的時候,部分介面尚未開發完成,在約定了介面定義之後,也可以使用 Mock 來模擬。

今天給大家介紹一款Python Mock工具:requests-mock

2、工具介紹

requests-mock是一個用於模擬HTTP請求的Python庫,它可以幫助開發人員在測試和開發過程中模擬各種HTTP請求和響應。使用requests-mock,可以用來模擬介面的各種場景,就像真正的伺服器一樣。

特點:

  1. 靈活性:requests-mock允許開發人員根據需要靈活地定義虛擬的HTTP響應,包括狀態碼、頭部資訊、響應體等。
  2. 易用性:requests-mock的API設計簡單易用,開發人員可以很容易地整合到他們的測試和開發工作流程中。
  3. 可擴充套件性:requests-mock支援自定義的響應生成器和請求匹配器,可以滿足各種複雜的測試需求。

適用場景:

    1. 單元測試:開發人員可以使用requests-mock模擬HTTP請求和響應,以便在單元測試中測試他們的程式碼。
    1. 整合測試:在進行整合測試時,requests-mock可以幫助開發人員模擬外部服務的行為,以驗證系統的整體功能。
    1. 開發過程中的快速原型驗證:在開發過程中,開發人員可以使用requests-mock快速驗證他們的程式碼對於不同的HTTP響應的處理情況。

透過Mock能夠幫助我們模擬系統各種行為,包括網路請求、檔案讀寫、資料庫操作、系統時間等等。這能夠在測試程式碼時降低對外部依賴的需求,從而提高程式碼的可測試性。

3、安裝

安裝必要的模組:requests, requests_mock。

pip install requests
pip install requests_mock

4、使用示例

示例一:使用Mock模擬GET、Post請求

以下是一個使用requests-mock模擬GET請求和POST請求的示例:

import requests
import requests_mock

# 模擬GET請求
with requests_mock.Mocker() as m:
    # 模擬post請求內容,返回的json格式,返回碼為200
    m.get('http://example.com/api/data', json={"name":"測試開發技術"}, status_code=200)
    
    response = requests.get('http://example.com/api/data')
    print(response.json())  

# 模擬POST請求
with requests_mock.Mocker() as m:

      # 模擬post請求內容,返回的json格式,返回碼為200
    m.post('http://example.com/api/submit',json={"name":"測試開發技術"}, status_code=201)
    
    response = requests.post('http://example.com/api/submit', data={'key': 'value'})
    print(response.json())  

在上面的示例中,我們使用requests-mock模擬了一個GET請求和一個POST請求。在每個模擬的上下文中,我們使用requests_mock.Mocker()建立了一個模擬器,並使用m.get()和m.post()分別定義了GET請求和POST請求的模擬響應。然後,我們使用requests庫傳送了實際的GET和POST請求,並列印了模擬的響應內容。

示例二:requests-mock在測試指令碼中的用法

import requests
import requests_mock

def get_data():
    response = requests.get('http://example.com/api')
    return response.json()
    
def test_get_data():
    adapter = requests_mock.Adapter()
    mock_response = {"status": "ok", "datas": [{"name": "狂師", "description": "公眾號:測試開發技術"}]}
    adapter.register_uri('GET', 'http://example.com/api', json=mock_response)

    with requests.Session() as session:
        session.mount('http://', adapter)
        data = get_data()
        assert data["status"] == "ok"
        assert len(news_data["datas"]) == 1
        assert news_data["datas"][0]["name"] == "狂師"    

示例三:requests-mock模擬請求錯誤異常
正常請求介面的時候,都會出現介面異常情況,比如超時哈,或者請求伺服器異常等操作,接下來小編透過requests-mock進行模擬伺服器異常的情況。

import requests
import requests_mock
from requests.exceptions import ConnectionError, Timeout

def test_exception():
    with requests_mock.Mocker() as m:
        # 模擬請求超時處理
        m.get('http://example.com/api',exc=Timeout)
        # 透過pytest.raises進行捕捉異常,如果存在異常,則判斷為pass
        with pytest.raises(Timeout):
            requests.get('http://example.com/api',timeout=3)
            # 模擬伺服器錯誤
            m.get('http://example.com/api', exc=ConnectionError)
           # 傳送請求並斷言是否丟擲了預期的異常
        with pytest.raises(ConnectionError):
            requests.get('http://example.com/api')

相關文章