python利用requests庫(kù)進(jìn)行接口測(cè)試的方法詳解
前言
之前介紹了接口測(cè)試中需要關(guān)注得測(cè)試點(diǎn),現(xiàn)在我們來看看如何進(jìn)行接口測(cè)試,現(xiàn)在接口測(cè)試工具有很多種,例如:postman,soapui,jemter等等,對(duì)于簡(jiǎn)單接口而言,或者我們只想調(diào)試一下,使用工具是非常便捷而且快速得,但是對(duì)于更復(fù)雜得場(chǎng)景,這些工具雖然也能實(shí)現(xiàn),但是難度要比寫代碼更大,而且定制化受到工具得功能影響,會(huì)
遇到一些障礙,當(dāng)然我們還要實(shí)現(xiàn)自動(dòng)化等等,鑒于以上因素,我們還是要學(xué)會(huì)使用代碼進(jìn)行接口測(cè)試,便于維護(hù)與擴(kuò)展,或者算是我們知識(shí)得補(bǔ)充把~
requests庫(kù)是python用來發(fā)起http/https請(qǐng)求得第三方庫(kù),支持get,post,put,delete等,requests特點(diǎn)是簡(jiǎn)單便捷、功能豐富,能夠滿足日常測(cè)試需求,所以我們選取requests庫(kù)進(jìn)行接口測(cè)試
運(yùn)行環(huán)境:
- 系統(tǒng):mac os 10.13.5
- python:3.6.4
- requests:2.19.1
接口為自己編寫得測(cè)試接口,測(cè)試請(qǐng)使用自己得接口
第一部分:安裝
1.安裝python(自行安裝),不會(huì)的朋友們可以參考這篇文章:http://www.dbjr.com.cn/article/112486.htm
2.安裝requests(linux和mac os可能會(huì)遇到權(quán)限問題,sudo安裝即可)
pip install -U requests
3.驗(yàn)證
localhost:~ mac$ python3 Python 3.6.4 (v3.6.4:d48ecebad5, Dec 18 2017, 21:07:28) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import requests >>>
沒有報(bào)錯(cuò)說明python與requests環(huán)境都沒問題
第二部分:基礎(chǔ)部分
以一個(gè)簡(jiǎn)單的get接口為例
import requests #導(dǎo)入requests模塊 response=requests.get("http://localhost:5000/hello")#對(duì)hello接口進(jìn)行g(shù)et請(qǐng)求,并獲取響應(yīng)信息
1.響應(yīng)信息(response)解析
print(response.text) print(response.content) ##輸出 你好 b'\xe4\xbd\xa0\xe5\xa5\xbd'
response.text是以str得形式返回得響應(yīng)信息
response.content是以bytes形式返回
實(shí)際使用中根據(jù)自己得情況進(jìn)行選擇
2.獲取狀態(tài)碼
print(response.status_code) ##輸出 200
3.獲取headers信息
print(response.headers) ##輸出 {'Content-Type': 'text/html; charset=utf-8', 'Content-Length': '6', 'Server': 'Werkzeug/0.14.1 Python/3.6.4', 'Date': 'Sun, 24 Jun 2018 02:55:27 GMT'}
4.獲取cookies信息
print(response.cookies) ##輸出 <RequestsCookieJar[]>
注意:這里與其他部分稍有不同,返回cookies的信息為cookies對(duì)象,而不是像前面部分返回得是字符串或者字典,cookies解析部分在后面會(huì)進(jìn)行單獨(dú)說明
5.獲取請(qǐng)求url
print(response.url) ###輸出 http://localhost:5000/hello
6.獲取反序列化后的得信息:
print(response.json()) ###輸出: {'name': 'john'}
注意:只有在返回信息為json格式時(shí)才能使用,否則會(huì)報(bào)json異常
7.獲取響應(yīng)時(shí)間
print(response.elapsed) print(response.elapsed.microseconds) print(response.elapsed.seconds) print(response.elapsed.total_seconds()) ##輸出 0:00:00.003773 3773 0 0.003773
第三部分:進(jìn)階部分
通常我們要想獲取正確得響應(yīng)信息需要傳遞一些參數(shù),針對(duì)不同得請(qǐng)求,傳參方式稍有不通,下面我們來看一下
這里我部署了一個(gè)get接口和一個(gè)post接口,功能都是講獲取得請(qǐng)求參數(shù)返回回來,以便我們查看效果
1.get請(qǐng)求傳遞參數(shù)
params={"name":"john","age":17} response=requests.get("http://localhost:5000/get_params",params=params) print(response.text) print(response.url) ##輸出 {"name": "john", "age": "17"} http://localhost:5000/get_params?name=john&age=17
說明:
這里做了三件事,先定義一個(gè)參數(shù)字典p,然后將參數(shù)字典以params參數(shù)傳遞給get方法,最后將響應(yīng)信息打印出來,從響應(yīng)信息可以看到參數(shù)被正確得傳遞進(jìn)去,requests幫我們把參數(shù)組合到了url里面
2.post請(qǐng)求傳遞參數(shù)
post傳遞參數(shù)和get有所不同,根據(jù)服務(wù)端取值方式進(jìn)行不同方式得傳遞
如果是傳遞得json格式得參數(shù)
p={"name":"john","age":17} response=requests.post("http://localhost:5000/post_params",json=p) print(response.text) ###輸出: {"name": "john", "age": 17}
如果是以html中form得形式傳遞參數(shù),
response=requests.post("http://localhost:5000/post_params",data=p) print(response.text)
如果form傳遞得是json格式需要以下面得方式
import json response=requests.post("http://localhost:5000/post_params",data=json.dumps(p)) print(response.text)
說明:
需要將字典行駛得參數(shù)轉(zhuǎn)換為json格式,再進(jìn)行傳遞
根據(jù)服務(wù)端得情況選中一種方式進(jìn)行傳遞參數(shù),通常情況下這三種情況可以滿足測(cè)試需求
第四部分:高級(jí)部分
1.操作cookies
有時(shí)候由于服務(wù)端需要取得cookies信息來進(jìn)行用戶身份驗(yàn)證, 或者另外一些用戶信息來進(jìn)行邏輯處理,這時(shí)候我們?cè)跍y(cè)試接口時(shí)需要手動(dòng)獲取cookies信息和添加cookies信息到請(qǐng)求中
先看設(shè)置cookies信息
注:我這里部署了一個(gè)set_cookies接口,將cookies信息作為響應(yīng)信息返回
my_cookies={"name":"john"} response=requests.get("http://localhost:5000/set_cookies",cookies=my_cookies) print(response.text) ##輸出 {"name": "john"}
說明:
這段代碼先定義了一個(gè)cookies字典,然后通過get方法,以cookies參數(shù)傳入,最后打印出響應(yīng)信息,可以看到cookies被成功種入請(qǐng)求中
我們?cè)僬f說如何獲取cookies并解析cookies信息
注:這里我部署了一個(gè)get_cookies接口,將{"name":"john"}作為cookies置入響應(yīng)中
response=requests.get("http://localhost:5000/get_cookies") cookies=response.cookies print(cookies["name"]) ##輸出: john
說明:
獲取cookies對(duì)象得信息,我們只需要像獲取字段得value一樣即可,可以看到我們成功獲取到了john
2.headers
看完了cookies之后,header就一目了然了,但是我還是同樣部署兩個(gè)接口(一個(gè)set_headers,一個(gè)get_headers)
#設(shè)置headers my_headers={"name":"john"} response=requests.get("http://localhost:5000/set_headers",headers=my_headers) print(response.text) #獲取headers response=requests.get("http://localhost:5000/get_headers") print(response.headers.get("name")) ##輸出: {"name": "john"} john
3.session
session可以理解為一段對(duì)話,而這段對(duì)話會(huì)紀(jì)錄這次會(huì)話中得一些內(nèi)容和狀態(tài),當(dāng)中斷這段對(duì)話,這些信息與狀態(tài)就丟失了session對(duì)象讓你能夠跨請(qǐng)求保持某些參數(shù)。它也會(huì)在同一個(gè) Session 實(shí)例發(fā)出的所有請(qǐng)求之間保持 cookie, 期間使用 urllib3 的 connection pooling 功能。所以如果你向同一主機(jī)發(fā)送多個(gè)請(qǐng)求,底層的 TCP 連接將會(huì)被重用,從而帶來顯著的性能提升
使用方法
注:我這里部署兩個(gè)接口,一個(gè)hello接口(用來演示使用全局cookies,將請(qǐng)求cookies返回),一個(gè)world接口(用來演示使用全局headers,將請(qǐng)求headers返回)
#設(shè)置headers my_info={"name":"john"} #創(chuàng)建全局session對(duì)象 my_session=requests.session() #設(shè)置全局cookies信息 my_session.cookies.set("name","john") #設(shè)置全局headers信息 my_session.headers.update(my_info) #演示全局cookies使用 response=my_session.get("http://localhost:5000/hello") print(response.text) #演示全局headers使用 response=my_session.get("http://localhost:5000/world") print(response.text) ##輸出 {"name": "john"} {"Host": "localhost:5000", "User-Agent": "python-requests/2.19.1", "Accept-Encoding": "gzip, deflate", "Accept": "*/*", "Connection": "keep-alive", "Name": "john", "Cookie": "name=john"}
4.設(shè)置timeout
通常接口都是為上游服務(wù)得,由于上游不能夠長(zhǎng)時(shí)間等待接口返回信息,都會(huì)設(shè)置一個(gè)超時(shí)時(shí)間,超過了這個(gè)時(shí)間,會(huì)將這個(gè)結(jié)果丟棄,如果我們要監(jiān)控線上接口有沒有超時(shí)情況,這時(shí)候我們發(fā)起請(qǐng)求的時(shí)候就需要設(shè)置一個(gè)超時(shí)時(shí)間,如果超過這個(gè)時(shí)間,就會(huì)拋出一個(gè)異常
response=requests.get("http://www.baidu.com",timeout=5)
說明:
將5這個(gè)超時(shí)時(shí)間以timeout參數(shù)傳入,這里得單位是秒
如果要想將連接(connect)與讀?。╮ead)都進(jìn)行設(shè)置,則需要傳入一個(gè)元組,第一個(gè)元素為connect超時(shí)事件,第二個(gè)元素為read超時(shí)時(shí)間
response=requests.get("http://www.baidu.com",timeout=(1,2))
5.hook
太晚了,先睡覺,明天補(bǔ)上~~
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Tensorflow tf.tile()的用法實(shí)例分析
這篇文章主要介紹了Tensorflow tf.tile()的用法實(shí)例分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05keras分類之二分類實(shí)例(Cat and dog)
這篇文章主要介紹了keras分類之二分類實(shí)例(Cat and dog),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07聊聊python里如何用Borg pattern實(shí)現(xiàn)的單例模式
這篇文章主要介紹了聊聊python里如何用Borg pattern實(shí)現(xiàn)的單例模式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-06-06python 捕獲 shell/bash 腳本的輸出結(jié)果實(shí)例
下面小編就為大家?guī)硪黄猵ython 捕獲 shell/bash 腳本的輸出結(jié)果實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01python使用mediapiple+opencv識(shí)別視頻人臉的實(shí)現(xiàn)
本文主要介紹了python使用mediapiple+opencv識(shí)別視頻人臉,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Python通過WHL文件實(shí)現(xiàn)離線安裝的操作詳解
在Python開發(fā)中,我們經(jīng)常需要安裝第三方庫(kù)來擴(kuò)展Python的功能,通常情況下,我們可以通過pip命令在線安裝這些庫(kù),此時(shí),WHL(Wheel)文件成為了非常實(shí)用的解決方案,本教程將結(jié)合實(shí)際案例,詳細(xì)介紹如何通過WHL文件在Python中進(jìn)行離線安裝,需要的朋友可以參考下2024-08-08