使用python-requests包進(jìn)行接口測(cè)試
單接口的測(cè)試
1.構(gòu)造參數(shù)
2.發(fā)送請(qǐng)求
3.校驗(yàn)結(jié)果
# 加載包
import requests
# 百度搜索的接口,搜索時(shí)內(nèi)容為requests
url = "http://www.baidu.com/s?wd=requests"
# 發(fā)送請(qǐng)求,將服務(wù)器返回的響應(yīng)放到變量r中
r= requests.get(url)
# 打印文本格式的響應(yīng)體
print(r.text)
# 對(duì)結(jié)果進(jìn)行斷言,判斷關(guān)鍵字在不在結(jié)果中
# assert "Requests: 讓 HTTP 服務(wù)人類 — Requests 2.18.1 文檔" in r.text
# 金融項(xiàng)目注冊(cè)接口測(cè)試
# get請(qǐng)求的參數(shù)拼接到URL的后面?key =value&key =value&key =value的格式
url="http://192.168.2.36:8089/futureloan/mvc/api/member/register?mobilephone=12345&pwd=12345"
r = requests.get(url)
print(r.text)
print(r.json()) # 如果響應(yīng)體是json格式的,使用r.json()
print(r.json()['code']) # r.json()后可以當(dāng)作字典使用
assert r.json()['code'] == "20108"
assert r.json()['msg'] == "密碼長(zhǎng)度必須為6~18"
# get請(qǐng)求的參數(shù),使用Params傳遞
url = "http://192.168.2.36:8089/futureloan/mvc/api/member/register"
cs = {
"mobilephone" :"18829512803",
"pwd":"12345",
"regname":"hello"
}
# params 不能寫錯(cuò),只能是request中定義好的參數(shù)名
r = requests.get(url,params=cs)
print(r.text)
assert r.json()['code'] == "20108"
assert r.json()['msg'] == "密碼長(zhǎng)度必須為6~18"
print("狀態(tài)碼", r.status_code)
print("狀態(tài)原因", r.reason)
print("響應(yīng)頭", r.headers)
print("cookies", r.cookies)
print("文本格式的響應(yīng)體", r.text)
print("請(qǐng)求頭", r.request.headers)
# 新知天氣的接口
url = "https://api.seniverse.com/v3/weather/now.json?key=Sh-LsrOsCyo4vp8Tp&location=xian"
r = requests.get(url)
print(r.json())
# 西安
print(r.json()['results'][0]['location']['name'], end='當(dāng)前的溫度:')
# 溫度
print(r.json()['results'][0]['now']['temperature'])
# 分割線
print("*"* 50)
# 獲取用戶列表
url = "http://192.168.2.36:8089/futureloan/mvc/api/member/list"
r = requests.get(url)
print(r.json())
print(r.request.headers) # 'User-Agent':'python-requests/2.25.1'
# 分割線
print("*"* 50)
# 設(shè)置User-Agent ,偽裝成是瀏覽器發(fā)的請(qǐng)求
hds = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36"
}
r = requests.get(url,headers=hds)
print(r.json())
print(r.request.headers) '''
用requests發(fā)送post請(qǐng)求
1.data傳參,傳的是表單格式式的參數(shù)
2.json傳參,傳的是json格式的參數(shù)
具體用data還是json傳參,要看接口是如何實(shí)現(xiàn)的
'''
import requests
# 金融登錄接口
url = "http://192.168.2.36:8089/futureloan/mvc/api/member/login"
cs = {
"mobilephone" :"18829512803",
"pwd":"123456789"
}
# 用data傳參
r = requests.post(url,data=cs)
print(r.text)
# 請(qǐng)求頭中,‘Content-Type’:‘a(chǎn)pplication/x-www-form-urlencoded’
print(r.request.headers)
# 用json傳參
r = requests.post(url,json= cs)
print(r.text) # 手機(jī)號(hào)不能為空,這個(gè)接口不支持用json的方式傳參,參數(shù)未識(shí)別出來(lái)
# 請(qǐng)求頭中,‘Content-Type’:‘a(chǎn)pplication/json'
print(r.request.headers)
# 租車系統(tǒng)登錄接口(沒(méi)有接口文檔,但是有界面時(shí),可以通過(guò)操作界面抓取接口)
url="http://192.168.2.36:8089/carRental/login/login.action"
cs = {
"loginname":"admin",
"pwd": "123456"
}
r = requests.post(url,data=cs)
print(r.text)
assert "<title>首頁(yè)-汽車出租系統(tǒng)</title>" in r.text
# print(r.request.headers) '''
上傳文件
files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload.
``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')``
or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)`
'''
import requests
# 接口測(cè)試的網(wǎng)站, 用戶發(fā)送請(qǐng)求 ,該網(wǎng)站把收到的請(qǐng)求,
# 組成json格式的響應(yīng),返回給用戶
# /post 是post方法
# /get 是get方法
# /delete 是delete方法
url = "http://www.httpbin.org/post"
cs= {
"user" : "admin",
"e-mail": " [email protected]"
}
path = "e:/test.txt"
with open(path, mode='r') as f:
fs = {
# "file1" 上傳接口的參數(shù)名,是接口定義的
"file1": (path, f),#二元組:(文件名字,文件對(duì)象)
"file2": (path, f ,"text/plain") # 三元組(文件名字,文件對(duì)象,文件類型)
}
r = requests.post(url, data=cs, files=fs)
print(r.text)
# 租車系統(tǒng),添加車輛時(shí),先上傳車輛的圖片
path = "e:/test.jpg"
url = "http://192.168.2.36:8089/carRental/file/uploadFile.action"
with open(path,mode='rb') as f:
fs = {
"mf" : (path,f ,"image/jpg") # 三元組(文件名字,文件對(duì)象,文件類型)
}
r = requests.post(url,data=cs ,files=fs)
print(r.text)
assert "2021-03-18" in r.json()['data']['src']
# 分割線
print("*"* 50)
# 一次上傳多個(gè)文件
url="http://www.httpbin.org/post"
path1 = "e:/test.txt"
path2 = "e:/test.jpg"
with open (path1,mode='r') as f1:
with open(path2,mode='rb') as f2:
fs={
"f1":"(path1,f1)",
"f2": (path2,f2,"image/jpg")
}
r = requests.post(url, files=fs)
print(r.text) '''
設(shè)置cookie
'''
import requests
# 沒(méi)有登錄的情況下,訪問(wèn)該接口,會(huì)跳轉(zhuǎn)到登錄頁(yè)面
url = "https://www.bagevent.com/account/dashboard"
r = requests.get(url)
print(r.text)
# 使用界面登錄后,服務(wù)器返回的cookie信息,訪問(wèn)該接口,返回登錄后的統(tǒng)計(jì)頁(yè)面
hds = {
"Cookie": '_ga=GA1.2.898728043.1615965992; _gid=GA1.2.872824269.1615965992; Hm_lvt_1fc37bec18db735c69ebe77d923b3ab9=1615965992; __auc=13ad1c891783f1445b1a072ed33; sdktoken=68edd18e335220d175f0bf64b259c6f5; uid=ef965a462d80fd4d62c3d118fe742e20; nickName=undefined; avatar=undefined; MEIQIA_TRACK_ID=1psK7g7yqqODa45WOXfKCti4C9P; BAGSESSIONID=02afdf9b-261c-4436-b259-4ddd02e0ca52; JSESSIONID=79B179498FBB86DE1EDDBB623F22A614; __asc=c76a6638178441def3c8c64462f; MEIQIA_VISIT_ID=1pv512xOjWnzNuo9ihmWU9LF9Pa; Hm_lpvt_1fc37bec18db735c69ebe77d923b3ab9=1616050526; _gat=1; BAG_EVENT_TOKEN_=02de735f68204d51009e7edda78e58c13a3fcdd1; BAG_EVENT_CK_KEY_=" [email protected]"; BAG_EVENT_CK_TOKEN_=2440f5d17af838308ba4b390db81af38'
}
r = requests.get(url,headers=hds)
print(r.text) '''
自動(dòng)管理cookie的機(jī)制,創(chuàng)建一個(gè)session = requests.session(), 自動(dòng)維護(hù)cookie信息
'''
import requests
s = requests.session() # 創(chuàng)建session
print("登錄之前的cookie信息:",s.cookies)
#百格登錄的接口
url = "https://www.bagevent.com/user/login"
cs = {
"access_type": 1,
"loginType": 1,
"emailLoginWay": 0,
"account": " [email protected] ",
"password": "qq2780487875",
"remindmeBox": "on",
"remindme": 1}
r = s.post(url, data=cs) #用session 發(fā)送請(qǐng)求
assert "<title>百格活動(dòng) - 賬戶總覽</title>" in r.text
# 分割線
print("*"* 50)
print("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=")
print("登錄之后的cookie信息:",s.cookies)
# 百格查詢的接口
url = "https://www.bagevent.com/account/dashboard"
r = s.get(url)
# print(r.text)
assert "<title>百格活動(dòng) - 賬戶總覽</title>" in r.text
# 退出登錄
url = "https://www.bagevent.com/user/login_out "
r = s.get(url)
print("退出登錄之后的cookie的信息:", s.cookies)
# RequestsCookieJar 轉(zhuǎn)成字典
ts = requests.utils.dict_from_cookiejar(s.cookies)
print(ts)
for k, v in ts.items():# 遍歷字典
print(k, ":", v)
tianGan = ["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]
diZhi = ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"]
for i in range(10):
print(tianGan [i%10] +diZhi[i%12],end=" ")
if i !=0 and i%10 ==9:
print()
# for j in range(12):
# print(tianGan +diZhi[j]) '''
timeout參數(shù),設(shè)置請(qǐng)求的超時(shí)時(shí)間
1.接口執(zhí)行耗時(shí)比較久,默認(rèn)的超時(shí)時(shí)間內(nèi)執(zhí)行不完。比如上傳一個(gè)2G的大文件
2.接口的性能要求,接口在xxms內(nèi)返回結(jié)果。如果xx ms,認(rèn)為性能不符合要求
'''
import requests
#淘寶查詢手機(jī)號(hào)碼歸屬地的接口
# tcc.taobao.com/cc/json/mobile_tel_segment.htm
url = "https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=18012345678"
# 該接口是否能在200 ms返回結(jié)果
for i in range(10):
try:
r = requests.get(url, timeout=0.2) #Connection to tcc.taobao.com timed out
#print(r.text)
print(r.status_code)
except Exception as e:
print(e)
'''
設(shè)置代理抓包
1.界面執(zhí)行是正確的
2.接口執(zhí)行時(shí)有問(wèn)題
分別抓取界面執(zhí)行過(guò)程的包,以及腳本執(zhí)行過(guò)程的包,對(duì)比差異來(lái)定位問(wèn)題
'''
print("*"*50)
proxy = {
"http":"http://127.0.0.1:8888", # 協(xié)議:代理地址
"https":"http://127.0.0.1:8888"
}
requests.get("http://www.baidu.com",proxies = proxy)
print(r.status_code)
# 證書校驗(yàn)失?。篶ertificate verify failed ,設(shè)置verify= False 不去校驗(yàn)證書
# 執(zhí)行時(shí)會(huì)出現(xiàn)警告,InsecureRequestWarning,不影響執(zhí)行
r= requests.get("https://www.bagevent.com",proxies=proxy,verify= False)
print(r.status_code)
|