1. 接口自動(dòng)化思維梳理
1.1接口自動(dòng)化的優(yōu)點(diǎn)
接口測(cè)試自動(dòng)化,簡(jiǎn)單來(lái)講就是功能測(cè)試用例腳本化然后執(zhí)行腳本,產(chǎn)生一份可視化測(cè)試報(bào)告。不管什么樣的測(cè)試方式,都是為了驗(yàn)證功能與發(fā)現(xiàn) BUG。那為什么要做接口測(cè)試自動(dòng)化呢?一句話概括就是為了節(jié)省人力成本。具體來(lái)說(shuō),包括以下幾點(diǎn):● 減輕自己工作量,把測(cè)試從枯燥的重復(fù)勞動(dòng)的人工測(cè)試中解放出來(lái);● 協(xié)助手工測(cè)試完成很難模擬或無(wú)法模擬的的工作;● 提高工作效率,比如測(cè)試環(huán)境的自動(dòng)化編譯、打包、部署、持續(xù)集成甚至持續(xù)交付等。● 協(xié)助定位問(wèn)題,比如接口層發(fā)現(xiàn)問(wèn)題了,可以通過(guò)添加的 traceID 定位到日志錯(cuò)誤或錯(cuò)誤代碼行。● ?盡早發(fā)現(xiàn) Bug,自動(dòng)通知測(cè)試人員。 一旦發(fā)現(xiàn)問(wèn)題,立即通知測(cè)試人員,快速高效。
1.2 事前準(zhǔn)備的主要兩個(gè)核心
?文檔的準(zhǔn)備
磨刀不誤砍柴工,準(zhǔn)備好分詳細(xì)的接口相關(guān)文檔能夠幫助后續(xù)接口自動(dòng)化測(cè)試工作的高效展開(kāi)。相關(guān)文檔包括但不限于一下內(nèi)容:①《需求文檔》明確定義了:接口背后的業(yè)務(wù)場(chǎng)景,該接口是干什么用的,用到哪里,每次調(diào)用會(huì)發(fā)生什么等;②《接口文檔》明確定義了:接口名,各個(gè)入?yún)⒅?,各個(gè)返回值,和其他相關(guān)信息;③《UI 交互圖》明確定義了:各單頁(yè)面需展示的數(shù)據(jù);頁(yè)面之間的交互等;④《數(shù)據(jù)表設(shè)計(jì)文檔》,明確定義了:表字段規(guī)則、表 N 多 N 關(guān)系(一對(duì)一、一對(duì)多、多對(duì)多)等;======================================================================務(wù)必和相關(guān)需求方確認(rèn)好文檔中的信息是可靠且最新的,只有依賴可靠的文檔才能設(shè)計(jì)出正確詳盡的接口用例,才能得到最正確的結(jié)果。
明確接口測(cè)試自動(dòng)化所需功能
測(cè)試斷言是自動(dòng)化測(cè)試中的測(cè)試通過(guò)條件,用于判斷測(cè)試用例是否符合預(yù)期。所以支持對(duì)返回值校驗(yàn)是一 個(gè)必須的功能。
數(shù)據(jù)隔離是指:具體的請(qǐng)求接口、參數(shù)、校驗(yàn)等數(shù)據(jù)做到與代碼相隔離,便于維護(hù),一旦需要調(diào)整接口用 例、新增接口用例時(shí)可很快速的找到位置。隔離的另一個(gè)好處就是可復(fù)用,框架可以推廣給其他團(tuán)隊(duì),使 用者可以使用相同的代碼,只需要根據(jù)要求填寫(xiě)各自用例即可測(cè)試起來(lái)。
做到數(shù)據(jù)隔離可維護(hù)后,數(shù)據(jù)傳遞是另外一個(gè)更重要的需求。接口測(cè)試時(shí),首先我們會(huì)實(shí)現(xiàn)單接口解耦, 后續(xù)按照業(yè)務(wù)場(chǎng)景組合多個(gè)接口。而數(shù)據(jù)傳遞是則是組合多個(gè)接口的必要條件,它讓接口用例之間可以做 到向下傳參。舉個(gè)例子:我們通過(guò)設(shè)備信息查詢接口查詢到當(dāng)前天貓精靈音箱的設(shè)備信息,該接口會(huì)返回 一個(gè) UUID,接下來(lái)我們要通過(guò)用戶信息查詢接口去查詢當(dāng)前設(shè)備綁定的用戶信息,此時(shí)第二個(gè)接口的請(qǐng) 求數(shù)據(jù)是需要從第一個(gè)接口用例中的返回中提取的
實(shí)際的業(yè)務(wù)場(chǎng)景測(cè)試會(huì)需要各種輔助功能的支持,比如隨機(jī)生成時(shí)間戳,請(qǐng)求 ID,隨機(jī)的手機(jī)號(hào)碼或位 置信息等等,此時(shí)我們就需要代碼可以支持做到識(shí)別對(duì)應(yīng)關(guān)鍵字時(shí)可以執(zhí)行對(duì)應(yīng)的功能函數(shù)進(jìn)行填充。
日志包含執(zhí)行的具體執(zhí)行接口、請(qǐng)求方式、請(qǐng)求參數(shù)、返回值、校驗(yàn)接口、請(qǐng)求時(shí)間、耗時(shí)等關(guān)鍵信息, 日志的好處一來(lái)是可以便于在新增用例有問(wèn)題時(shí)快速定位出哪里填寫(xiě)有問(wèn)題,二來(lái)是發(fā)現(xiàn) bug 時(shí)方便向 開(kāi)發(fā)反饋提供數(shù)據(jù),開(kāi)發(fā)可以從觸發(fā)時(shí)間以及參數(shù)等信息快速定位到問(wèn)題所在。
目前測(cè)試環(huán)境包括但不限于日常、預(yù)發(fā)一、預(yù)發(fā)二、線上等等,因此用例不單單只能在一個(gè)環(huán)境上執(zhí)行, 需要同一份接口用例可以在日常、預(yù)發(fā)、線上等多個(gè)環(huán)境都可以執(zhí)行。所以框架需要做到可配置,便于切 換,調(diào)用不同的配置文件可以在不同的環(huán)境執(zhí)行。
用例執(zhí)行后,就是到了向團(tuán)隊(duì)展示結(jié)果的時(shí)候了,一個(gè)可視化的報(bào)告可以便于團(tuán)隊(duì)成員了解到每次自動(dòng)化 接口用例執(zhí)行的成功數(shù)、失敗數(shù)等數(shù)據(jù)。
對(duì)于已經(jīng)有測(cè)試用例并測(cè)試完成的接口,我們希望能夠形成回歸用例,在下一個(gè)版本迭代或上線之前,通 過(guò)已有用例進(jìn)行一個(gè)回歸測(cè)試,確保新上線的功能不影響已有功能。因此,這就需要接口自動(dòng)化測(cè)試是可 持續(xù)集成的而不是一次性的。
2. Requests庫(kù)的基本介紹及安裝
2.1?Requests庫(kù)簡(jiǎn)介
Requests 是用Python語(yǔ)言編寫(xiě),基于 urllib,采用 Apache2 Licensed 開(kāi)源協(xié)議 的 HTTP 庫(kù)。它比 urllib 更加方便,可以節(jié)約我們大量的工作,完全滿足 HTTP 測(cè)試需求。
官網(wǎng)介紹:https://cn.python-requests.org/zh_CN/latest/
Requests 也可用于爬蟲(chóng)
2.2 Requests庫(kù)安裝
pip install requests
pip show requests
3.?Requests庫(kù)的實(shí)戰(zhàn)應(yīng)用
3.1 Requests庫(kù)請(qǐng)求源碼理解
Requests庫(kù)常用方法
Requests庫(kù)常用的方法及對(duì)應(yīng)的參考如下 :● requests.requests()● requests.get(‘https://github.com/timeline.json’) :GET請(qǐng)求● requests.post(“http://httpbin.org/post”) :POST請(qǐng)求● requests.put(“http://httpbin.org/put”) :PUT請(qǐng)求(提交修改全部的數(shù) 據(jù))● requests.delete(“http://httpbin.org/delete”) :DELETE請(qǐng)求● requests.head(“http://httpbin.org/get”) :HEAD請(qǐng)求● requests.patch(“http://httpbin.org/get”) :PATCH請(qǐng)求(提交修改部分 數(shù)據(jù))● requests.options(‘https://github.com/timeline.json’) :OPTIONS請(qǐng) 求(跨域預(yù)檢請(qǐng)求)
requests方法的請(qǐng)求參數(shù)詳解
requests.requests(method, url, **kwargs)
● method:請(qǐng)求方式:GET, PUT,POST,HEAD, PATCH, delete, OPTIONS7種方式● url:網(wǎng)絡(luò)鏈接● kwargs: (13個(gè)可選參數(shù))
kwargs可選參數(shù)如下:
參數(shù)值
|
參數(shù)概述
|
params
|
字典或者字節(jié)序列,作為參數(shù)增加到url中
|
json
|
JSON格式的數(shù)據(jù),作為requests的內(nèi)容
|
headers
|
字典,HTTP定制頭
|
data
|
是第二個(gè)控制參數(shù),向服務(wù)器提交數(shù)據(jù),[POST請(qǐng)求用的居多]
|
cookies
|
字典或CookieJar, Requests中的cookie
|
auth
|
元組,支持HTTP認(rèn)證功能
|
files
|
字典類(lèi)型,傳輸文件
|
timeout
|
設(shè)置的超時(shí)時(shí)間,秒為單位
|
proxies
|
字典類(lèi)型,設(shè)定訪問(wèn)代理服務(wù)器,可以增加登錄認(rèn)證
|
allow_redirects
|
True/False,默認(rèn)為T(mén)rue, 重定向開(kāi)關(guān)
|
stream
|
True/False,默認(rèn)為T(mén)rue,獲取內(nèi)容立即下載開(kāi)關(guān)
|
verity
|
True/False,默認(rèn)為T(mén)rue, 認(rèn)證SSL證書(shū)
|
cert
|
本地SSL證書(shū)路徑 |
3.2 接口測(cè)試實(shí)戰(zhàn)
1. 導(dǎo)入對(duì)應(yīng)的包: import requests2. 弄清楚對(duì)應(yīng)的接口四要素:接口URL、請(qǐng)求方法、請(qǐng)求參數(shù)、響應(yīng)數(shù)據(jù),3. 把這些內(nèi)容用代碼依次實(shí)現(xiàn)。
GET 請(qǐng)求示例
# get()方法的參數(shù)
requests.get(url, params=None, **kwargs)
- url: 頁(yè)面的url鏈接
- params: url中的額外參數(shù),字典或字節(jié)流,非必選
代碼示例1:一個(gè)簡(jiǎn)單的get請(qǐng)求
import requests
url = "http://xxxx.com/"
res = requests.get(url)
#獲取對(duì)應(yīng)的響應(yīng)數(shù)據(jù):可以對(duì)數(shù)據(jù)格式進(jìn)行指定
print(res.text) #text得到的是一個(gè)html信息
執(zhí)行后終端輸出一個(gè)巨長(zhǎng)的html
代碼示例二:使用params把分開(kāi)的url參數(shù)、路徑拼接到url,實(shí)現(xiàn)正常請(qǐng)求
#案例二: 把url參數(shù)的環(huán)境變量和對(duì)應(yīng)的參數(shù)/路徑分開(kāi)
url = "http://xxx.com/"
url_path = "s=api/user/login"
res = requests.get(url, params=url_path) # 執(zhí)行的時(shí)候會(huì)自動(dòng)把參數(shù)拼接到url中
print(res.url) # 輸出的查看url是否是一個(gè)正確且完整的url
3.3 常用響應(yīng)( Response)數(shù)據(jù)
響應(yīng)參數(shù)方法
|
響應(yīng)參數(shù)概述
|
r.status_code
|
響應(yīng)狀態(tài)碼
|
r.content
|
字節(jié)方式的響應(yīng)體,會(huì)自動(dòng)為你解碼 gzip 和 deflate 壓
縮
|
r.headers
|
以字典對(duì)象存儲(chǔ)服務(wù)器響應(yīng)頭,但是這個(gè)字典比較特殊,
字典鍵不區(qū)分大小寫(xiě),若鍵不存在則返回None
|
r.json()
|
Requests中內(nèi)置的JSON解碼器,必須帶上()
|
r.url
|
獲取url
|
r.encoding
|
編碼格式
|
r.cookies
|
獲取cookie
|
r.raw
|
返回原始響應(yīng)體
|
r.text
|
字符串方式的響應(yīng)體,會(huì)自動(dòng)根據(jù)響應(yīng)頭部的字符編碼進(jìn)
行解碼
|
r.raise_for_status()
|
失敗請(qǐng)求(非200響應(yīng))拋出異常
|
狀態(tài)碼
1xx:指示信息--表示請(qǐng)求已接收,繼續(xù)處理
2xx:成功--表示請(qǐng)求已被成功接收、理解、接受
3xx:重定向--要完成請(qǐng)求必須進(jìn)行更進(jìn)一步的操作
4xx:客戶端錯(cuò)誤--請(qǐng)求有語(yǔ)法錯(cuò)誤或請(qǐng)求無(wú)法實(shí)現(xiàn)
5xx:服務(wù)器端錯(cuò)誤--服務(wù)器未能實(shí)現(xiàn)合法的請(qǐng)求
200 OK//客戶端請(qǐng)求成功
400 Bad Request//客戶端請(qǐng)求有語(yǔ)法錯(cuò)誤,不能被服務(wù)器所理解
401 Unauthorized//請(qǐng)求未經(jīng)授權(quán),這個(gè)狀態(tài)代碼必須和WWW-Authenticate報(bào)頭域一起使用
403 Forbidden//服務(wù)器收到請(qǐng)求,但是拒絕提供服務(wù)
404 Not Found//請(qǐng)求資源不存在,eg:輸入了錯(cuò)誤的URL
500 Internal Server Error//服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤
503 Server Unavailable//服務(wù)器當(dāng)前不能處理客戶端的請(qǐng)求,一段時(shí)間后可能恢復(fù)正常
代碼示例
上面提到的所有的Response響應(yīng)參數(shù)方法
語(yǔ)法結(jié)構(gòu):定義的返回值的接收對(duì)象.方法名
部分示例如下:
import requests
url = "http://xxxx.com/"
url_path = "s=api/user/login"
res = requests.get(url, params=url_path) # 執(zhí)行的時(shí)候會(huì)自動(dòng)把參數(shù)拼接到url中
# print(res.text)
print("url:",res.url)
print("json串:",res.json())
print("狀態(tài)碼:",res.status_code)
反過(guò)來(lái)說(shuō),如果發(fā)送請(qǐng)求之后,得到的響應(yīng)數(shù)據(jù)不是我想要的呢?
解決思路: 首先把請(qǐng)求數(shù)據(jù)打印出來(lái) 打印請(qǐng)求的語(yǔ)法結(jié)構(gòu):接收返回值對(duì)象.request.方法名代碼示例如下:
import requests
url = "http://xxxx.com/"
res = requests.get(url)
print("查看請(qǐng)求方法:",res.request.method)
print("查看請(qǐng)求url:",res.request.url)
print("查看請(qǐng)求body:",res.request.body)
print("查看請(qǐng)求頭:",res.request.headers)
3.4 POST接口測(cè)試實(shí)戰(zhàn)
之前我們一直也在強(qiáng)調(diào),POST的請(qǐng)求參數(shù)的類(lèi)型很多。
而控制它的就是由 請(qǐng)求頭當(dāng)中的 Content-Type 。
所以我們?cè)陂_(kāi)發(fā)的過(guò)程中需要注意客戶端發(fā)送請(qǐng)求 (Request)時(shí)的Content-Type設(shè)置,如果設(shè)置的不準(zhǔn)確,很有可能導(dǎo)致請(qǐng)求失 敗,甚至也會(huì)返回415錯(cuò)誤。
注:415 錯(cuò)誤是 Unsupported media type,即不支持的媒體類(lèi)型。
---------------->>>
一般Content-Type的使用遵守原則:
● 如果普通表單提交:Content-Type:application/x-www-form-urlencoded
● json格式: Content-Type:application/json
● 如果是文件上傳:Content-Type:multipart/form-data
案例1:普通表單提交
post請(qǐng)求默認(rèn)是以form表單提交的
encoding = "utf8"
"""
post請(qǐng)求:登陸接口、
請(qǐng)求參數(shù)數(shù)據(jù)類(lèi)型x-www-form-urlencoded格式(form表單提交)
接口請(qǐng)求四要素:url、請(qǐng)求方法、請(qǐng)求參數(shù)、響應(yīng)數(shù)據(jù)
"""
import requests
# ur完整的請(qǐng)求l
url = "http://域名/路徑/xxx"
# 公共參數(shù)
pulic_data = {"application":"app","application_client_type":"weixin"}
# 請(qǐng)求參數(shù):body
data = {"accounts":"hailey","pwd":"hailey123","type":"username"}
# ------------------發(fā)送請(qǐng)求------------------
res = requests.post(url,params=pulic_data,data=data)
# ------------------獲取響應(yīng)數(shù)據(jù)------------------
print(res.json())
print("響應(yīng)頭:",res.headers)
# ------------------獲取請(qǐng)求數(shù)據(jù)------------------
print("請(qǐng)求頭:",res.request.headers)
案例2:json格式
想要指定請(qǐng)求參數(shù)的數(shù)據(jù)類(lèi)型為json:
方法1:只需要加一個(gè)json參數(shù),把data賦給json即可
--------------->>
案例1、案例2,我這邊使用的是同一個(gè)測(cè)試網(wǎng)址,是因?yàn)樵摼W(wǎng)址做了特殊處理,只要提交的請(qǐng)求參數(shù)正確,不論哪種請(qǐng)求的數(shù)據(jù)類(lèi)型都可以兼容。
實(shí)際工作中,是否能夠做到這樣兼容,需要看公司的代碼邏輯有沒(méi)有這樣處理
# 指定請(qǐng)求數(shù)據(jù)為json格式提交:方法1
import requests
url = "http://域名/路徑/xxx"
pulic_data = {"application": "app", "application_client_type": "weixin"}
data = {"accounts": "hailey", "pwd": "hailey123", "type": "username"}
# 指定請(qǐng)求參數(shù)的數(shù)據(jù)類(lèi)型為json,只需要加一個(gè)json參數(shù),把data賦給json即可
res = requests.post(url,params=pulic_data,json=data)
print("請(qǐng)求數(shù)據(jù):",res.request.headers)
print("響應(yīng)數(shù)據(jù):",res.headers)
想要指定請(qǐng)求參數(shù)的數(shù)據(jù)類(lèi)型為json:并且能不能請(qǐng)求參數(shù)的還是以data提交,只設(shè)置一下請(qǐng)求頭為json呢?
方法2:
① 添加請(qǐng)求頭設(shè)置
② data是字典類(lèi)型,需要轉(zhuǎn)換為json類(lèi)型,不然打印響應(yīng)信息會(huì)報(bào)錯(cuò)
------------>>
方式2處理起來(lái)稍微麻煩點(diǎn),但是如果是封裝的代碼,就可以靈活處理,只設(shè)置請(qǐng)求頭,可以在不同的地方使用不同的請(qǐng)求數(shù)據(jù)類(lèi)型
具體代碼如下:
import json
import requests
url = "http://xxx.com/index.php?s=/api/user/login"
pulic_data = {"application": "app", "application_client_type": "weixin"}
data = {"accounts": "hailey", "pwd": "hailey123", "type": "username"}
json_data = json.dumps(data) # 將data字典轉(zhuǎn)為json
header = {'Content-Type':'application/json;charset=utf-8'} # 添加請(qǐng)求頭設(shè)置
res = requests.post(url,params=pulic_data,headers=header,data=json_data)
print("請(qǐng)求數(shù)據(jù):", res.request.headers)
print("響應(yīng)數(shù)據(jù):", res.request.headers)
案例3:文件上傳
基于flask框架實(shí)現(xiàn)的文件上傳進(jìn)行上傳文件。Flask是一個(gè)基于Python開(kāi)發(fā)并且依賴jinja2模板和Werkzeug WSGI服務(wù)的一個(gè)微型框架。
# Flask框架安裝
pip install flask # 安裝命令
pip show flask # 安裝驗(yàn)證
flask的簡(jiǎn)單應(yīng)用
定義一個(gè)Flask 應(yīng)用程序?qū)ο?: app = Flask ( __name__ )靜態(tài)路由: @app . route ( '/upload' )指定允許的請(qǐng)求方法:@app.route('/login', methods=['GET', 'POST'])
上傳文件接口
flask應(yīng)用的完整代碼(基于這段代碼,才能完成下面的上傳操作):
# flie name:uploadFile.py
from flask import Flask, request, jsonify
import os
# 創(chuàng)建了一個(gè)名為 app 的 Flask 應(yīng)用程序?qū)ο蟆?app = Flask(__name__)
# 設(shè)置接口的路徑,以及對(duì)應(yīng)的請(qǐng)求方式
@app.route('/upload', methods=['POST'])
def upload():
# 當(dāng)沒(méi)有image屬性提示用戶
if 'image' not in request.files:
data = {
'msg': '當(dāng)前未填寫(xiě)image參數(shù)',
'code': 400,
}
return jsonify(data)
# 獲取到當(dāng)前圖片請(qǐng)求中的文件
file = request.files['image']
print(file.filename)
# 把對(duì)應(yīng)的圖片進(jìn)行保存到當(dāng)前的目錄下的img目錄(保存在當(dāng)前服務(wù)器某個(gè)目錄下)
save_path = os.path.join('img', file.filename)
file.save(save_path)
data = {
'msg': '上傳成功',
'code': 200
}
return jsonify(data)
if __name__ == '__main__':
app.run()
先把代碼運(yùn)行,讓服務(wù)啟動(dòng)(啟動(dòng)的是我們本地電腦的服務(wù)),不要手動(dòng)停止
上傳文件請(qǐng)求
# file name:p3_file.py
# 基于flask實(shí)現(xiàn)文件上傳
import requests
# url:服務(wù)器 + 代碼中定義的路徑
url = "http://127.0.0.1:5000/upload"
# 請(qǐng)求參數(shù):image
file_data = {"image":open("python進(jìn)階.png","rb")}
res = requests.post(url,files=file_data)
print("響應(yīng)數(shù)據(jù):",res.json())
print("響應(yīng)的數(shù)據(jù)類(lèi)型:",res.headers)
案例4:保持Session
如下代碼,有兩個(gè)接口:登錄接口,查詢信息接口,必須登錄之后才可以查詢用戶信息。當(dāng)接口之間有上下游關(guān)聯(lián)時(shí),就需要 保持Session,即會(huì)話機(jī)制Session也是一種鑒權(quán),從頭到尾,關(guān)閉就會(huì)失效具體項(xiàng)目不同,有的只有token鑒權(quán),沒(méi)有Session鑒權(quán)
保持Session接口
由于手上沒(méi)有可用的具有Session鑒權(quán)的項(xiàng)目,這里還是使用falks實(shí)現(xiàn)一個(gè)本地服務(wù)器,設(shè)置Session機(jī)制來(lái)演示效果;
以下是falks代碼:
file name:loginApi.py
from flask import Flask, request, jsonify, session
import os
app = Flask(__name__)
app.secret_key = os.urandom(24) # 設(shè)置一個(gè)密鑰,用于加密 session 數(shù)據(jù)
# 模擬用戶信息,實(shí)際項(xiàng)目中需要替換為真實(shí)的用戶信息
data = {
"username": "hailey",
"password": "admin"}
# 登錄接口
@app.route('/login', methods=['POST'])
def login():
data = request.get_json()
username = data.get('username')
password = data.get('password')
if username in users and users[username] == password:
# 登錄成功,設(shè)置session
session['logged_in'] = True
return 'Login successful', 200
else:
return 'Login failed', 401
# 查詢信息接口,需要登錄才能訪問(wèn)
@app.route('/get_info')
def get_info():
if 'logged_in' in session and session['logged_in']:
# 用戶已登錄,返回用戶信息
return 'User Info: OK' # 返回用戶信息
else:
# 用戶未登錄,返回未授權(quán)的狀態(tài)碼
return 'Unauthorized', 401
if __name__ == '__main__':
app.run(debug=True)
還是先把代碼運(yùn)行,讓服務(wù)啟動(dòng)(啟動(dòng)的是我們本地電腦的服務(wù)),不要手動(dòng)停止
發(fā)送Session接口
錯(cuò)誤示范:
# file name:p4_session.py
import requests
data = {
"username": "hailey",
"password": "admin"}
#方法1:顯示對(duì)應(yīng)的未授權(quán)
response = requests.post("http://127.0.0.1:5000/login",json=data)
print("響應(yīng)內(nèi)容:",response.text)
response = requests.get("http://127.0.0.1:5000/get_info")
print(":",response.text)
正確姿勢(shì):
在requests庫(kù)中,如果需要進(jìn)行session保持 1、需要實(shí)例化一個(gè)對(duì)象 2. 通過(guò)對(duì)應(yīng)的對(duì)象去進(jìn)行方法調(diào)用
import requests
data = {
"username": "hailey",
"password": "admin"}
session = requests.Session() #示例化對(duì)象
res = session.post("http://127.0.0.1:5000/login",json=data)
print("響應(yīng)內(nèi)容:",res.text)
res = session.get("http://127.0.0.1:5000/get_info")
print("get_info:",res.text)
3.5 josn概述補(bǔ)充
JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,常用于數(shù)據(jù)的序列化和傳輸。它基于JavaScript的語(yǔ)法,但可以被多種編程語(yǔ)言支持和解析。
下面是一個(gè)簡(jiǎn)單的JSON示例:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-816763.html
{
"name": "John",
"age": 30,
"isStudent": false,
"grades": [85, 92, 78],
"address": {
"street": "123 Main St",
"city": "New York"
}
}
JSON的優(yōu)點(diǎn)
1. 簡(jiǎn)潔:相對(duì)于其他數(shù)據(jù)交換格式,JSON的語(yǔ)法簡(jiǎn)潔明了,易于閱讀和編寫(xiě)。2. 可讀性好:JSON使用人類(lèi)可讀的文本格式,便于開(kāi)發(fā)人員理解和調(diào)試。3. 平臺(tái)無(wú)關(guān):JSON可以被多種編程語(yǔ)言支持和解析,使得不同平臺(tái)之間的數(shù)據(jù)交換變得更加容易。4. 支持復(fù)雜數(shù)據(jù)結(jié)構(gòu):JSON支持嵌套的對(duì)象和數(shù)組,可以表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。在編程中,您可以使用相應(yīng)編程語(yǔ)言提供的JSON庫(kù)或工具來(lái)解析和生成JSON數(shù)據(jù),以實(shí)現(xiàn)數(shù)據(jù)的序列化、傳輸和解析。
3.6?斷言(Assert)
斷言(Assertion)是一種在編程中常用的技術(shù),用于檢查代碼中的條件是否滿足,以確保程序的正確性。斷言通常在程序中的關(guān)鍵位置或重要的檢查點(diǎn)處使用,用于驗(yàn)證預(yù)期的條件是否為真。斷言的基本概念是:在代碼中插入一條斷言語(yǔ)句,該語(yǔ)句會(huì)在運(yùn)行時(shí)進(jìn)行條件判斷:????????如果條件為假(False),則會(huì)觸發(fā)斷言錯(cuò)誤,并中斷程序的執(zhí)行。????????如果條件為真(True),則程序會(huì)繼續(xù)執(zhí)行。
使用斷言的目的
斷言通常用于以下目的:1. 調(diào)試和驗(yàn)證 :斷言可以用于驗(yàn)證程序的正確性和邏輯,幫助開(kāi)發(fā)人員在調(diào)試過(guò)程中發(fā)現(xiàn)問(wèn)題和錯(cuò)誤。通過(guò)斷言,可以檢查程序中的假設(shè)是否成立,并在條件不滿足時(shí)提前發(fā)現(xiàn)問(wèn)題。2. 防御性編程 :斷言可以用于檢查輸入?yún)?shù)有效性或執(zhí)行結(jié)果的正確性,以避免程序在非預(yù)期情況下繼續(xù)行。3. 測(cè)試和驗(yàn)證 :斷言可以用于編寫(xiě)單元測(cè)試或驗(yàn)證代碼的正確性,幫助捕捉潛在的錯(cuò)誤和異常情況。
代碼示例
# assert 表達(dá)式,表達(dá)式失敗之后顯示的字符串
import requests
url = "http://xxxx.com/index.php?s=/api/user/login"
# 公共參數(shù)
pulic_data = {"application":"app","application_client_type":"weixin"}
# 請(qǐng)求參數(shù):body
data = {"accounts":"hailey","pwd":"hailey123","type":"username"}
# ------------------發(fā)送請(qǐng)求------------------
res = requests.post(url,params=pulic_data,data=data)
# ------------------獲取響應(yīng)數(shù)據(jù)------------------
print(res.json())
response = res.json()
# ------------------獲取數(shù)據(jù),進(jìn)行斷言處理------------------
# 斷言成功
# assert "登錄成功" == response["msg"],"期望結(jié)果是:{0},實(shí)際結(jié)果是:{1}".format("登錄成功",response["msg"])
# 斷言失敗
assert "登錄失敗" == response["msg"],"期望結(jié)果是:{0},實(shí)際結(jié)果是:{1}".format("登錄失敗",response["msg"])
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-816763.html
到了這里,關(guān)于接口測(cè)試 03 -- 接口自動(dòng)化思維 & Requests庫(kù)應(yīng)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!