pytest-req外掛:更簡單的做介面測試
背景
我們經常會用到 pytest 和 requests 進行介面自動化測試。 pytest 提供了非常方便的外掛開發能力,在pytest中使用requests庫首先會想到是否有已經封裝好的外掛,就像pytest-playwright
、pytest-selenium
一樣。可惜找了一下沒有。
於是,自己動手實現了一個,本來命名為pytest-requests
,pypi
倉庫搜尋了一下被被佔用了。pytest-requests
是一個用YAML寫介面用例的庫,類似httprunner
。最終命名為pytest-req
。
整個外掛的設計思路比較簡單,將requests常用的請求方法設計成pytest.fixture
鉤子函式;增加請求
和響應
日誌,從seldom框架封裝的程式碼,使用pytest-base-url
實現基礎URL的全域性設定。最終使用起來比 直接在 pytest寫requests請求簡單了很多。
簡介
pytest requests plugin
pytest 使用 requests 庫的外掛。
特點
- 完全相容Requests庫的使用。
- 提供詳細的請求/響應日誌,並支援可配置。
- 輕量級,非侵入。
安裝
支援pip
安裝pytest-req
外掛。
pip install pytest-req
使用
pytest-req 完全相容 Requests API 如下:
pytest-req(fixture) | requests |
---|---|
get() | requests.get() |
post() | requests.post() |
put() | requests.put() |
delete() | requests.delete() |
patch() | requests.patch() |
options() | requests.options() |
head() | requests.head() |
session() | requests.session() |
session IDE無法自動補全。可以正常使用session下面的get()/post()/put()...
👉︎ [檢視測試]https://github.com/SeldomQA/pytest-req/tree/main/tests
⭐ 支援簡單的請求
# test_req.py
def test_post_method(post):
"""
test post request
"""
s = post('https://httpbin.org/post', data={'key': 'value'})
assert s.status_code == 200
def test_get_method(get):
"""
test get request
"""
payload = {'key1': 'value1', 'key2': 'value2'}
s = get("https://httpbin.org/get", params=payload)
assert s.status_code == 200
⭐ 支援Session
# test_session.py
def test_session(session):
"""
test session, keep requests cookie
"""
s = session
s.get('https://httpbin.org/cookies/set/sessioncookie/123456789')
s.get('https://httpbin.org/cookies')
⭐ 支援base-url
# test_base_url.py
def test_req_base_url(get):
"""
test base url
pytest --base-url=https://httpbin.org
"""
payload = {'key1': 'value1', 'key2': 'value2'}
s = get("/get", params=payload)
assert s.status_code == 200
更多的使用方式參考 requests 文件。
✅ 執行測試
> pytest -s # 執行當前所有用例
> pytest -s test_req.py # 執行指定檔案
> pytest -s --base-url=https://httpbin.org # 指定base-url
-s
檢視詳細日誌
--base-url
指定請求基礎URL,用例中可以不設定。
更多的執行方式請參考 pytest 文件。
🗒 執行日誌
> pytest -qs --base-url=https://httpbin.org test_base_url.py
2024-07-24 12:18:39 | INFO | plugin.py | -------------- Request -----------------[🚀]
2024-07-24 12:18:39 | INFO | plugin.py | [method]: GET [url]: /get
2024-07-24 12:18:39 | DEBUG | plugin.py | [params]:
{
"key1": "value1",
"key2": "value2"
}
2024-07-24 12:18:40 | INFO | plugin.py | -------------- Response ----------------[🛬️]
2024-07-24 12:18:40 | INFO | plugin.py | successful with status 200
2024-07-24 12:18:40 | DEBUG | plugin.py | [type]: json [time]: 1.655213
2024-07-24 12:18:40 | DEBUG | plugin.py | [response]:
{
"args": {
"key1": "value1",
"key2": "value2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.32.3",
"X-Amzn-Trace-Id": "Root=1-66a080a0-2cb150485a260ae75b34b32f"
},
"origin": "171.10.176.209",
"url": "https://httpbin.org/get?key1=value1&key2=value2"
}
.2024-07-24 12:18:40 | INFO | plugin.py | -------------- Request -----------------[🚀]
2024-07-24 12:18:40 | INFO | plugin.py | [method]: GET [url]: /cookies/set/sessioncookie/123456789
2024-07-24 12:18:43 | INFO | plugin.py | -------------- Response ----------------[🛬️]
2024-07-24 12:18:43 | INFO | plugin.py | successful with status 200
2024-07-24 12:18:43 | DEBUG | plugin.py | [type]: json [time]: 0.807398
2024-07-24 12:18:43 | DEBUG | plugin.py | [response]:
{
"cookies": {
"sessioncookie": "123456789"
}
}
2024-07-24 12:18:43 | INFO | plugin.py | -------------- Request -----------------[🚀]
2024-07-24 12:18:43 | INFO | plugin.py | [method]: GET [url]: /cookies
2024-07-24 12:18:44 | INFO | plugin.py | -------------- Response ----------------[🛬️]
2024-07-24 12:18:44 | INFO | plugin.py | successful with status 200
2024-07-24 12:18:44 | DEBUG | plugin.py | [type]: json [time]: 1.226137
2024-07-24 12:18:44 | DEBUG | plugin.py | [response]:
{
"cookies": {
"sessioncookie": "123456789"
}
}
.
2 passed in 5.36s