pytest-req外掛:更簡單的做介面測試

虫师發表於2024-07-26

pytest-req外掛:更簡單的做介面測試

背景

我們經常會用到 pytest 和 requests 進行介面自動化測試。 pytest 提供了非常方便的外掛開發能力,在pytest中使用requests庫首先會想到是否有已經封裝好的外掛,就像pytest-playwrightpytest-selenium一樣。可惜找了一下沒有。

於是,自己動手實現了一個,本來命名為pytest-requestspypi 倉庫搜尋了一下被被佔用了。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

相關文章