因爲web接口自動化測試須要用到python的第三方庫--requests庫,運用requests庫能夠模擬發送http請求,再結合unittest測試框架,就能完成web接口自動化測試。html
因此筆者今天先來總結一下requests庫的用法。但願對你們(尤爲是新手)有幫助哦!你們可要仔細閱讀,加油!python
1.GET請求git
1.1查看get函數的使用github
1.3 requests函數的返回值(http響應)json
1.4舉例說明api
4.2關於請求的Headers的Accept-Encoding說明
前提:
requests庫是python的第三方庫,須要提早安裝哦,能夠直接用pip命令:python –m pip install requests
按照慣例,先將requests庫的屬性打印出來,看看哪些屬性。
>>> import requests
>>> dir(requests) #查看requests庫的屬性
['ConnectionError', 'HTTPError', 'NullHandler', 'PreparedRequest', 'Request', 'RequestException', 'Response', 'Session', 'Timeout', 'TooManyRedirects', 'URLRequired', '__author__', '__build__', '__builtins__', '__copyright__', '__doc__', '__file__', '__license__', '__name__', '__package__', '__path__', '__title__', '__version__', 'adapters', 'api', 'auth', 'certs', 'codes', 'compat', 'cookies', 'delete', 'exceptions', 'get', 'head', 'hooks', 'logging', 'models', 'options', 'packages', 'patch', 'post', 'put', 'request', 'session', 'sessions', 'status_codes', 'structures', 'utils']
因此能夠看到requests的屬性有get,post,delete,put,對應http請求的method方法。
經常使用的是get和post請求。get請求通常是查詢獲取資源信息。post通常是更新資源信息。
>>> help(requests.get) #查看requests庫的屬性get請求函數的使用
Help on function get in module requests.api:
get(url, params=None, **kwargs)
Sends a GET request.
:param url: URL for the new :class:`Request` object.
:param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
url:調用接口的URL地址。
params:爲可選參數,該參數是一個字典類型。數據會以鍵/值對的形式置於 URL 中,跟在一個問號的後面。舉例說明,若r=requests.get("http://httpbin.org/get",params={'key1':'value1','key2':'value2'}) 那麼,最終請求的目標URL爲http://bin.org/get?key1=val1& key2=val2。
**kwargs:其餘可選參數,例如headers,files,cookies,auth,timeout,json等。
例如:auth=(‘username',’password’):接口安全測試中用到的用戶認證。
例如:headers = {'user-agent': 'my-app/0.0.1'}:可定製發送請求頭。
返回的是response類對象(requests.models.Response)。來自requests模塊 models.py裏的Response類
>>> r=requests.get('http://httpbin.org/get') #查看response的屬性
>>> dir(r)
['__attrs__', '__bool__', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getstate__', '__hash__', '__init__', '__iter__', '__module__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_content', '_content_consumed', 'apparent_encoding', 'close', 'connection', 'content', 'cookies', 'elapsed', 'encoding', 'headers', 'history', 'is_permanent_redirect', 'is_redirect', 'iter_content', 'iter_lines', 'json', 'links', 'ok', 'raise_for_status', 'raw', 'reason', 'request', 'status_code', 'text','url']
對於返回對象經常使用的屬性以下:
json():生成json數據對象的方法。若是 JSON 解碼失敗, r.json
就會拋出一個異常。例如,響應內容是 401 (Unauthorized),嘗試訪問 r.json
將會拋出 ValueError: No JSON object could be decoded
異常。
status_code:響應狀態碼。
encoding:編碼,如utf-8。
url:目標url。
headers:響應頭。類型爲字典類型,若鍵不存在則返回None。
text:響應內容。字符串方式,會自動根據響應頭部的字符編碼進行解碼。若是你改變了編碼r.encoding,每當你訪問 r.text
,Request 都將會使用 r.encoding
的新值。
content:二進制響應內容。字節方式,會自動爲你解碼gzip和deflate壓縮。
raw:原始響應內容,也就是 urllib 的 response 對象,請求中要加stream=True,再使用 r.raw.read() 讀取。
r.raise_for_status:失敗請求(非200響應)拋出異常。
>>> payload={'key1':'value1','key2':'value2'}
>>> r=requests.get("http://httpbin.org/get",params=payload)
>>> r.status_code
200
>>> r.json()
{u'origin': u'113.98.252.236', u'headers': {u'Host': u'httpbin.org', u'Accept-Encoding': u'gzip, deflate', u'Accept': u'*/*', u'User-Agent': u'python-requests/2.7.0 CPython/2.7.11 Windows/7'}, u'args': {u'key2': u'value2', u'key1': u'value1'}, u'url': u'http://httpbin.org/get?key2=value2&key1=value1'}
>>> r.url #url:params數據會以鍵/值對的形式置於 URL 中,跟在一個問號的後面。
u'http://httpbin.org/get?key2=value2&key1=value1'
>>> r.headers
{'content-length': '334', 'server': 'nginx', 'connection': 'keep-alive', 'access-control-allow-credentials': 'true', 'date': 'Fri, 09 Dec 2016 09:04:40 GMT', 'access-control-allow-origin': '*', 'content-type': 'application/json'}
>>> r.headers['content-type']
'application/json'
>>> r.raw
<requests.packages.urllib3.response.HTTPResponse object at 0x0000000002E64E10>
>>> r.cookies
<RequestsCookieJar[]>
>>> r.text
u'{\n "args": {\n "key1": "value1", \n "key2": "value2"\n }, \n "headers": {\n "Accept": "*/*", \n "Accept-Encoding": "gzip, deflate", \n "Host": "httpbin.org", \n "User-Agent": "python-requests/2.7.0 CPython/2.7.11 Windows/7"\n }, \n "origin": "113.98.252.236", \n "url": "http://httpbin.org/get?key2=value2&key1=value1"\n}\n'
>>> r.content
'{\n "args": {\n "key1": "value1", \n "key2": "value2"\n }, \n "headers": {\n "Accept": "*/*", \n "Accept-Encoding": "gzip, deflate", \n "Host": "httpbin.org", \n "User-Agent": "python-requests/2.7.0 CPython/2.7.11 Windows/7"\n }, \n "origin": "113.98.252.236", \n "url": "http://httpbin.org/get?key2=value2&key1=value1"\n}\n'
>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.get("http://httpbin.org/get", params=payload,stream=True)
>>> r.raw
<requests.packages.urllib3.response.HTTPResponse object at 0x0000000003105940>
>>> r.raw.read()
'{\n "args": {\n "key1": "value1", \n "key2": "value2"\n }, \n "headers": {\n "Accept": "*/*", \n "Accept-Encoding": "gzip, deflate", \n "Host": "httpbin.org", \n "User-Agent": "python-requests/2.7.0 CPython/2.7.11 Windows/7"\n }, \n "origin": "113.98.252.236", \n "url": "http://httpbin.org/get?key2=value2&key1=value1"\n}\n'
r.json():json數據,能夠看出與1.4中的r.json()值一致。
r.headers:響應頭數據,能夠看出與1.4中r.headers值一致。
r.raw:響應原始數據
綜上所述,經過requests.get("某url",params={字典類型參數鍵值對})模擬瀏覽器發送一個http的請求(其中請求的方法是get,請求的url地址以下形式
http://httpbin.org/get?key2=value2&key1=value1),服務器處理數據後,會返回一個response對象,經過讀取response對象的屬性值,如json數據,能夠作一系列的斷言,從而驗證該接口返回的數據是否正確。
>>> help(requests.post) #查看requests庫的屬性post請求函數的使用
post(url, data=None, json=None, **kwargs)
Sends a POST request.
:param url: URL for the new :class:`Request` object.
:param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
:param json: (optional) json data to send in the body of the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
url:調用接口的URL地址。
data:爲可選參數,該參數是一個字典類型。
json:爲可選參數,該參數是一個json類型。
**kwargs:其餘可選參數,例如headers等。
同1.3
json():生成json數據對象的方法。若是 JSON 解碼失敗, r.json
就會拋出一個異常。例如,響應內容是 401 (Unauthorized),嘗試訪問 r.json
將會拋出 ValueError: No JSON object could be decoded
異常。
status_code:響應狀態碼。
encoding:編碼,如utf-8。
url:目標url。
headers:響應頭。類型爲字典類型,若鍵不存在則返回None。
text:響應內容。字符串方式,會自動根據響應頭部的字符編碼進行解碼。若是你改變了編碼r.encoding,每當你訪問 r.text
,Request 都將會使用 r.encoding
的新值。
content:二進制響應內容。字節方式,會自動爲你解碼gzip和deflate壓縮。
raw:原始響應內容,也就是 urllib 的 response 對象,請求中要加stream=True,再使用 r.raw.read() 讀取。
r.raise_for_status:失敗請求(非200響應)拋出異常。
>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.post("http://httpbin.org/post", data=payload)
>>> r.status_code
200
>>> r.json()
{u'files': {}, u'origin': u'113.98.252.236', u'form': {u'key2': u'value2', u'key1': u'value1'}, u'url': u'http://httpbin.org/post', u'args': {}, u'headers': {u'Content-Length': u'23', u'Accept-Encoding': u'gzip,deflate', u'Accept': u'*/*', u'User-Agent': u'python-requests/2.7.0 CPython/2.7.11 Windows/7', u'Host': u'httpbin.org', u'Content-Type': u'application/x-www-form-urlencoded'}, u'json': None, u'data': u''}
>>> r.url
u'http://httpbin.org/post'
>>> r.headers
{'content-length': '461', 'server': 'nginx', 'connection': 'keep-alive', 'access-control-allow-credentials': 'true', 'date': 'Mon, 12 Dec 2016 02:46:14 GMT', 'access-control-allow-origin': '*', 'content-type': 'application/json'}
>>> r.headers['content-type']
'application/json'
>>> r.raw
<requests.packages.urllib3.response.HTTPResponse object at 0x0000000002EE4A58>
>>> r.text
u'{\n "args": {}, \n "data": "", \n "files": {}, \n "form": {\n "key1": "value1", \n "key2": "value2"\n }, \n "headers": {\n "Accept": "*/*", \n "Accept-Encoding": "gzip, deflate", \n "Content-Length": "23", \n "Content-Type": "application/x-www-form-urlencoded", \n "Host": "httpbin.org", \n "User-Agent": "python-requests/2.7.0 CPython/2.7.11 Windows/7"\n }, \n "json": null, \n "origin": "113.98.252.236", \n "url": "http://httpbin.org/post"\n}\n'
>>> r.content
'{\n "args": {}, \n "data": "", \n "files": {}, \n "form": {\n "key1": "value1", \n "key2": "value2"\n }, \n "headers": {\n "Accept": "*/*", \n "Accept-Encoding": "gzip, deflate", \n "Content-Length": "23", \n "Content-Type": "application/x-www-form-urlencoded", \n "Host": "httpbin.org", \n "User-Agent": "python-requests/2.7.0 CPython/2.7.11 Windows/7"\n }, \n "json": null, \n "origin": "113.98.252.236", \n "url": "http://httpbin.org/post"\n}\n'
>>> payload = {'key1': 'value1', 'key2': 'value2'}
#獲取原始響應內容
>>> r = requests.post("http://httpbin.org/post", data=payload,stream=True)
>>> r.raw
<requests.packages.urllib3.response.HTTPResponse object at 0x0000000003105208>
>>> r.raw.read()
'{\n "args": {}, \n "data": "", \n "files": {}, \n "form": {\n "key1": "value1", \n "key2": "value2"\n }, \n "headers": {\n "Accept": "*/*", \n "Accept-Encoding": "gzip, deflate", \n "Content-Length": "23", \n "Content-Type": "application/x-www-form-urlencoded", \n "Host": "httpbin.org", \n "User-Agent": "python-requests/2.7.0 CPython/2.7.11 Windows/7"\n }, \n "json": null, \n "origin": "113.98.252.236", \n "url": "http://httpbin.org/post"\n}\n'
#使用 json
參數直接傳遞
>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.post("http://httpbin.org/post", json=payload)
>>> r.text
u'{\n "args": {}, \n "data": "{\\"key2\\": \\"value2\\", \\"key1\\": \\"value1\\"}", \n "files": {}, \n "form": {}, \n "headers": {\n "Accept": "*/*", \n "Accept-Encoding": "gzip, deflate", \n "Content-Length": "36", \n "Content-Type": "application/json", \n "Host": "httpbin.org", \n "User-Agent": "python-requests/2.7.0 CPython/2.7.11 Windows/7"\n }, \n "json": {\n "key1": "value1", \n "key2": "value2"\n }, \n "origin": "113.98.252.236", \n "url": "http://httpbin.org/post"\n}\n'
r.json():json數據,能夠看出與2.4中的r.json()值一致。
注:經過json進行傳參的json數據
r.headers:響應頭數據,能夠看出與2.4中r.headers值一致。
r.raw:響應原始數據
綜上所述,經過requests.post("某url",data={字典類型參數鍵值對})模擬瀏覽器發送一個http的請求(其中請求的方法是post,請求的url地址以下形式
http://httpbin.org/get),服務器處理數據後,會返回一個response對象,經過讀取response對象的屬性值,如json數據,能夠作一系列的斷言,從而驗證該接口返回的數據是否正確。
>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> headers = {'user-agent': 'my-app/0.0.1'}
>>> r = requests.post("http://httpbin.org/post", data=payload,headers=headers)
用fiddler抓包,能夠看到,發送請求的請求頭中的user-agent的值爲設置的值。
注意: 全部的 header 值必須是 string
、bytestring 或者 unicode。
>>> import os
>>> os.getcwd()
'D:\\pythontest'
>>> f=open('1.txt','w+')
>>> f.write('test')
>>> os.listdir('D:\\pythontest')
['1.txt',]
>>> import requests
>>> url = 'http://httpbin.org/post'
>>> files = {'file': open('1.txt', 'rb')}
>>> r = requests.post(url, files=files)
>>> r.text
u'{\n "args": {}, \n "data": "", \n "files": {\n "file": ""\n }, \n "form": {}, \n "headers": {\n "Accept": "*/*", \n "Accept-Encoding": "gzip, deflate", \n "Content-Length": "141", \n "Content-Type": "multipart/form-data; boundary=37de3eb22a754f34849771891b77bd23", \n "Host": "httpbin.org", \n "User-Agent": "python-requests/2.7.0 CPython/2.7.11 Windows/7"\n }, \n "json": null, \n "origin": "113.98.252.236", \n "url": "http://httpbin.org/post"\n}\n'
用fiddler抓包,能夠看到,響應的JSON數據中有file。
>>> url = 'http://httpbin.org/cookies'
>>> cookies = dict(cookies_are='working')
>>> r = requests.get(url, cookies=cookies)
>>> r.text
u'{\n "cookies": {\n "cookies_are": "working"\n }\n}\n'
經過上面抓包能夠看出:
GET請求的數據會附在URL以後(就是 把數據放置在HTTP協議頭中),以?分割URL和傳輸數據,參數之間以&相連,如:login.action?name=hyddd& password=idontknow&verify=%E4%BD%A0%E5%A5%BD。若是數據是英文字母/數字,原樣發送,若是是空格,轉換爲+,若是是中文/其餘字符,則直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX爲該符號以 16進製表示的ASCII。
POST把提交的數據則放置在是HTTP包的包體中。
4.2關於請求的Headers的Accept-Encoding說明
請求的headers中的client項中的Accept-Encoding的,例如Accept-Encoding: gzip, deflate。瀏覽器申明本身接收的編碼方法,一般指定壓縮方法,是否支持壓縮,支持什麼壓縮方法(gzip,deflate)(注意:這不是隻字符編碼)。
4.3關於響應的Headers的Content-Type說明
Content-Type是返回消息中很是重要的內容,表示後面的文檔屬於什麼MIME類型。
Content-Type: [type]/[subtype]; parameter。例如最多見的就是text/html,它的意思是說返回的內容是文本類型,這個文本又是HTML格式的。原則上瀏覽器會根據 Content-Type來決定如何顯示返回的消息體內容。
type有下面的形式:
Text:用於標準化地表示的文本信息,文本消息能夠是多種字符集和或者多種格式的;
Multipart:用於鏈接消息體的多個部分構成一個消息,這些部分能夠是不一樣類型的數據;
Application:用於傳輸應用程序數據或者二進制數據;
Message:用於包裝一個E-mail消息;
Image:用於傳輸靜態圖片數據;
Audio:用於傳輸音頻或者音聲數據;
Video:用於傳輸動態影像數據,能夠是與音頻編輯在一塊兒的視頻數據格式。
subtype用於指定type的詳細形式。
parameter能夠用來指定附加的信息,更多狀況下是用於指定text/plain和text/htm等的文字編碼方式的charset參數。
注:若是想要作好web自動化接口測試,必需要了解HTTP協議,想要了解更多HTTP協議,可查看HTTP協議詳解 轉自小坦克
文檔地址:http://docs.python-requests.org/en/master/
中文文檔地址:http://cn.python-requests.org/zh_CN/latest/
Python下載地址:https://pypi.python.org/pypi/requests
Github資源:https://github.com/kennethreitz/requests
requests做者:https://www.kennethreitz.org/
測試接口服務端:http://httpbin.org/
(尊重筆者的勞動哦,轉載請說明出處哦。)