python內建了HTTP庫 urllib,可以用於傳送http請求。基於Python的第三方庫Requests是對urllib的再次封裝,相比urllib更加簡潔易用。Requests庫不僅用於介面測試,還用在Python爬蟲、量化交易等。本文介紹Requests庫的使用方法。
Requests
HTTP介面測試涉及到以下幾個方面:
- 構造請求方法:get、post、put、 delete、head ......
- 構造請求體:form、json、xml、 binary
- 分析響應結果:status code、 response body、 json path、 xpath
下面介紹使用Requests怎麼實現這些步驟。
Requests安裝
Github地址:Python HTTP Requests for Humans
requests官方文件: https://requests.readthedocs.io/zh_CN/latest/index.html
安裝:
pip install requests
http請求響應測試介面:https://httpbin.testing-studio.com/
也可以自己本地搭建,GitHub地址:https://github.com/postmanlabs/httpbin
Requests常見介面請求方法構造
常見介面請求方法:
r = requests.get('https://api.github.com/events') #get請求
r = requests.post('http://httpbin.org/post', data = {'key':'value'}) #post請求
r = requests.put('http://httpbin.org/put', data = {'key':'value'})
r = requests.delete('http://httpbin.org/delete')
r = requests.head('http://httpbin.org/get')
r = requests.options('http://httpbin.org/get')
請求目標構造
請求URL
import requests
r = requests.get('https://api.github.com/events') #get請求
print(r.status_code)
輸出:
200
header構造
普通的 header
url = 'https://api.github.com/some/endpoint'
headers ={user-agent': 'my-app/0.0.1'}
r= requests.get(url, headers=headers)
cookie
url = 'http://httpbin.org/cookies'
cookies = dict(cookies_are='working')
r = requests.get(url, cookies=cookies)
構造請求體
請求體通過鍵值對的形式編碼,有多種形式的請求體,比如query引數、form請求、binary請求(上傳檔案)以及結構化請求:json、xml、 json rpc等。
Get Query請求
payload= {'key':'valuel','key2':'value2'}
r = requests.get('https://httpbin.org/get', params=payload)
Form請求引數
payload = {'key':'valuel','key2':'value2'}
r = requests.post("https://httpbin.org/post", data=payload)
JSON請求體構造
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
r = requests.post(url, json=payload)
xml請求
import requests
xml ="""<?xml version='1.0' encoding='utf-8'?><a>6</a>"""
headers={'Content-type':'application/xml'}
r = requests.post('http://httpbin.org/post', data=xml, headers=headers).text
binary請求
上傳檔案
url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)
介面測試斷言
介面測試中需要通過檢查響應是否符合預期來測試介面有效性,也就是對介面響應進行斷言。
響應
- r.url:
- r.status_code
- r.headers
- r.cookies
- r.encoding
- r.content
- r.text
- r.json()
import requests
class TestRequest():
def test_get(self):
r = requests.get('https://api.github.com/events') #get請求
assert r.status_code == 200
結構化響應斷言
下面是請求Github專案倉庫API,GitHub API可參考:https://docs.github.com/cn/rest/overview。
import requests
import json
r = requests.get('https://api.github.com/repos/hiyongz/DjangoDemo')
json_data = r.json()
print(json.dumps(json_data, indent=4))
響應的部分json資料如下:
{
"id": 272401302,
"node_id": "MDEwOlJlcG9zaXRvcnkyNzI0MDEzMDI=",
"name": "DjangoDemo",
"full_name": "hiyongz/DjangoDemo",
"private": false,
"owner": {
"login": "hiyongz",
"id": 20513021,
"node_id": "MDQ6VXNlcjIwNTEzMDIx",
"avatar_url": "https://avatars0.githubusercontent.com/u/20513021?v=4",
"gravatar_id": "",
...................
}
接下來介紹不同方法對這個json響應進行斷言。
json斷言
json斷言
import requests
def test_json(self):
r = requests.get('https://api.github.com/repos/hiyongz/DjangoDemo')
assert r.json()['owner']['login'] == "hiyongz"
JSONPath斷言
JSONPath文件:https://goessner.net/articles/JsonPath/
JSONPath表示式與XPath類似,是XPath在json中的應用,全稱XPath for JSON,用於從JSON文件中提取資料。JSONPath表示式和XPath語法對比如下:
XPath | JSONPath | Description |
---|---|---|
/ | $ | 跟節點 |
. | @ | 當前節點 |
/ | . or [] | 兒子節點 |
.. | N/A | 父節點 |
// | .. | 子孫節點 |
* | * | 匹配所有節點 |
@ | N/A | 屬性 |
[] | [] | 下標操作符 |
| | [,] | 多選 |
N/A | [start : end : step] | 切片 |
[] | ?() | 過濾表示式 |
N/A | () | script 表示式 |
() | N/A | 分組 |
Python中有個jsonpath庫可用於處理json資料:https://pypi.org/project/jsonpath/
安裝:
pip install jsonpath
和前面一樣,斷言登入名:
import requests
from jsonpath import jsonpath
def test_json(self):
r = requests.get('https://api.github.com/repos/hiyongz/DjangoDemo')
assert jsonpath(r.json(), '$..login')[0] == "hiyongz"
schema斷言
JSON Schema可以用來註釋和驗證 JSON 文件,官網:http://json-schema.org/。
JSON Schema可用來新增自定義規則,可以自定義資料型別:
schema = {
"type" : "object",
"properties" : {
"price" : {"type" : "number"},
"name" : {"type" : "string"},
},
}
可以看到,除了欄位值斷言外,可以使用JSON Schema來斷言介面返回值的型別。
把json格式轉成schema,線上生成schema網址:https://jsonschema.net/
jsonschema是使用JSON Schema的Python庫,通過 pip install jsonschema
命令安裝。
import requests
from jsonschema import validate
def test_get_login_jsonschema(self):
url = "https://api.github.com/repos/hiyongz/DjangoDemo"
r = requests.get(url)
data = r.json()
schema = {
"name" : "DjangoDemo",
"owner" : {
"login" : "hiyongz",
},
}
validate(data, schema=schema)
JSON Schema可以用來進行自動校驗:在介面測試中,每次執行的時候自動儲存當前的 schema,下次執行對比上次的 schema,如果發現變更就報錯
xml解析斷言
xml檔案解析可以使用requests_xml,參考:https://github.com/erinxocon/requests-xml
也可以使用Python xml.etree.ElementTree模組解析xml資料,可以使用Xpath定位,使用方法參考Web自動化測試:xpath & CSS Selector定位
xml.etree.ElementTree模組xml解析舉例:
import xml.etree.ElementTree as ET
root = ET.fromstring(countrydata)
root.findall(".")
root.findall("./country/neighbor")
root.findall(".//year/..[@name='Singapore']")
root.findall(".//*[@name='Singapore']/year")
root.findall(".//neighbor[2]")
和JSON Schema一樣,也有一個XML Schema,用於解析xml文件,文件參考:https://www.w3.org/2001/XMLSchema
Python庫安裝: pip install xmlschema
hamcrest斷言
除了常用的Assert斷言以外,有一個功能更加強大的斷言方法叫Hamcrest 斷言,具有豐富的斷言匹配器,支援多種語言,官網地址:http://hamcrest.org/
下面簡單介紹一下Python中的hamcrest斷言使用方法
PyHamcrest GitHub倉庫地址:https://github.com/hamcrest/PyHamcrest
文件:https://pyhamcrest.readthedocs.io/en/v2.0.2/tutorial/
安裝PyHamcrest:
pip install PyHamcrest
斷言登入名:
import requests
from hamcrest import *
def test_hamcrest(self):
r = requests.get('https://api.github.com/repos/hiyongz/DjangoDemo')
data = r.json()
assert_that(data['owner']['login'], equal_to("hiyongz"))
文章標題:介面測試框架Requests
本文作者:hiyo
本文連結:https://www.cnblogs.com/hiyong/p/14288463.html
歡迎關注公眾號:「測試開發小記」及時接收最新技術文章!