python-使用requests庫(kù)進(jìn)行接口測(cè)試

之前介紹了接口測(cè)試中需要關(guān)注得測(cè)試點(diǎn),現(xiàn)在我們來(lái)看看如何進(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用來(lái)發(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(自行安裝)
2.安裝requests(linux和mac os可能會(huì)遇到權(quán)限問(wè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
>>>

沒(méi)有報(bào)錯(cuò)說(shuō)明python與requests環(huán)境都沒(méi)問(wè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ú)說(shuō)明
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)求,傳參方式稍有不通,下面我們來(lái)看一下

這里我部署了一個(gè)get接口和一個(gè)post接口,功能都是講獲取得請(qǐng)求參數(shù)返回回來(lái),以便我們查看效果
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

說(shuō)明:
這里做了三件事,先定義一個(gè)參數(shù)字典p,然后將參數(shù)字典以params參數(shù)傳遞給get方法,最后將響應(yīng)信息打印出來(lái),從響應(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)

說(shuō)明:
需要將字典行駛得參數(shù)轉(zhuǎn)換為json格式,再進(jìn)行傳遞

根據(jù)服務(wù)端得情況選中一種方式進(jìn)行傳遞參數(shù),通常情況下這三種情況可以滿足測(cè)試需求

第四部分:高級(jí)部分

1.操作cookies
有時(shí)候由于服務(wù)端需要取得cookies信息來(lái)進(jìn)行用戶身份驗(yàn)證, 或者另外一些用戶信息來(lái)進(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"}

說(shuō)明:
這段代碼先定義了一個(gè)cookies字典,然后通過(guò)get方法,以cookies參數(shù)傳入,最后打印出響應(yīng)信息,可以看到cookies被成功種入請(qǐng)求中

我們?cè)僬f(shuō)說(shuō)如何獲取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

說(shuō)明:
獲取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, 期間使用 urllib3connection pooling 功能。所以如果你向同一主機(jī)發(fā)送多個(gè)請(qǐng)求,底層的 TCP 連接將會(huì)被重用,從而帶來(lái)顯著的性能提升

使用方法
注:我這里部署兩個(gè)接口,一個(gè)hello接口(用來(lái)演示使用全局cookies,將請(qǐng)求cookies返回),一個(gè)world接口(用來(lái)演示使用全局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í)間,超過(guò)了這個(gè)時(shí)間,會(huì)將這個(gè)結(jié)果丟棄,如果我們要監(jiān)控線上接口有沒(méi)有超時(shí)情況,這時(shí)候我們發(fā)起請(qǐng)求的時(shí)候就需要設(shè)置一個(gè)超時(shí)時(shí)間,如果超過(guò)這個(gè)時(shí)間,就會(huì)拋出一個(gè)異常

response=requests.get("http://www.baidu.com",timeout=5)

說(shuō)明:
將5這個(gè)超時(shí)時(shí)間以timeout參數(shù)傳入,這里得單位是秒

如果要想將連接(connect)與讀取(read)都進(jìn)行設(shè)置,則需要傳入一個(gè)元組,第一個(gè)元素為connect超時(shí)事件,第二個(gè)元素為read超時(shí)時(shí)間

response=requests.get("http://www.baidu.com",timeout=(1,2))

5.hook
太晚了,先睡覺(jué),明天補(bǔ)上~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評(píng)論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,538評(píng)論 3 417
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 176,423評(píng)論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 62,991評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,761評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 55,207評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 42,419評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,959評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,782評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,983評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,222評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 34,653評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 35,901評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,678評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,978評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容