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,可以用來模擬介面的各種場景,就像真正的伺服器一樣。
特點:
- 靈活性:requests-mock允許開發人員根據需要靈活地定義虛擬的HTTP響應,包括狀態碼、頭部資訊、響應體等。
- 易用性:requests-mock的API設計簡單易用,開發人員可以很容易地整合到他們的測試和開發工作流程中。
- 可擴充套件性:requests-mock支援自定義的響應生成器和請求匹配器,可以滿足各種複雜的測試需求。
適用場景:
-
- 單元測試:開發人員可以使用requests-mock模擬HTTP請求和響應,以便在單元測試中測試他們的程式碼。
-
- 整合測試:在進行整合測試時,requests-mock可以幫助開發人員模擬外部服務的行為,以驗證系統的整體功能。
-
- 開發過程中的快速原型驗證:在開發過程中,開發人員可以使用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')