另一篇文章:自動(dòng)化測(cè)試框架(pytest)&附學(xué)習(xí)視頻
web自動(dòng)化
學(xué)習(xí)視頻,學(xué)習(xí)文檔-白月黑羽
說明:
1緊跟著寫的不加/,不加空格-表示同一級(jí)別信息,加空格表示后代
2.css定位tag,id,class時(shí)分別有不同的標(biāo)識(shí),其他屬性都要加[]進(jìn)行搜索,
Xpath所有屬性都要都加【】,tag不用
3. css在使用tag,id,class定位時(shí)可以不寫全信息,其他要寫全
4.//用在xpath 空格用在css
5.xpath 寫屬性時(shí),前面一定要加標(biāo)簽,或者是* //*[@id=‘west’]>
6. //div/button[1] xpath的1就是list的0
API測(cè)試
1.什么是接口測(cè)試?
對(duì)軟件系統(tǒng)消息交互接口的測(cè)試,叫接口測(cè)試。鏈接
- SMS系統(tǒng)前端 和 后端服務(wù)器之間是消息交互接口,2.使用美團(tuán)訂餐, 美團(tuán)APP和美團(tuán)服務(wù)器之間, 也是消息交互的。
- HTTP協(xié)議的特點(diǎn)是,客戶端發(fā)出一個(gè)HTTP請(qǐng)求給 服務(wù)端,服務(wù)端就返回一個(gè)HTTP響應(yīng)。好像程序的API調(diào)用。
- API接口請(qǐng)求消息,通常都需要 服務(wù)端程序進(jìn)行 一番處理,比如:對(duì)請(qǐng)求的權(quán)限檢查,從數(shù)據(jù)庫中讀出數(shù)據(jù),進(jìn)行信息過濾和 格式轉(zhuǎn)換,最后在HTTP響應(yīng)中返回給客戶端。
- 為什么 獲取網(wǎng)頁、圖片這些 HTTP消息 通常不叫 API 接口消息呢?
答:網(wǎng)頁、圖片、css 這些資源,都是 靜態(tài)資源 , 就是一個(gè)個(gè)文件存儲(chǔ)在服務(wù)器上的,獲取這些信息,服務(wù)端直接讀取文件,返回給客戶端即可,無需特別的數(shù)據(jù)處理。 - 基于 HTTP 的接口測(cè)試工具, 常見的 有 Postman、Jmeter等,這些工具核心功能都是類似,都是用來構(gòu)建HTTP請(qǐng)求消息,并且解析收到的HTTP響應(yīng)消息, 用戶來判斷是否符合預(yù)期,也完全python+requsets庫實(shí)現(xiàn)自己開發(fā)測(cè)試工具,進(jìn)行測(cè)試。
- web測(cè)試,測(cè)試的是整個(gè)系統(tǒng)(前段+后端),接口測(cè)試就是前后端之前的消息交互
2.內(nèi)外部接口
內(nèi)部接口: 產(chǎn)品(也就是被測(cè)系統(tǒng)) 內(nèi)部子系統(tǒng)之間 的接口。
外部接口:產(chǎn)品(也就是被測(cè)系統(tǒng))和 另外的系統(tǒng)交互的接口。
3.fiddler抓包工具
瀏覽器,F(xiàn)12可以查看http請(qǐng)求消息,http響應(yīng)消息。
Requests 庫 是用來發(fā)送HTTP請(qǐng)求,接收HTTP響應(yīng)的一個(gè)Python庫。
當(dāng)軟件運(yùn)行時(shí),發(fā)送的http請(qǐng)求會(huì)經(jīng)過fiddler,關(guān)閉軟件,恢復(fù)正常
4.Python實(shí)現(xiàn)接口測(cè)試
4.1簡(jiǎn)單看一下測(cè)試文檔
根據(jù)下面的這種測(cè)試接口文檔的要求,我們利用requests庫進(jìn)行http的請(qǐng)求,看服務(wù)器是否返回我們的需求。
大量工作時(shí),建立一個(gè)package, 將相應(yīng)方法封裝到類中。
4.2Requsets庫發(fā)送http請(qǐng)求
4.3檢查http響應(yīng)
注意消息體
- 傳送數(shù)據(jù)時(shí),將本地寫的字符串,通過encode編碼成字節(jié)串,發(fā)送給服務(wù)器,服務(wù)器處理完,返回字節(jié)串,我們需要再解碼成字符串方便閱讀。
- response.content(字節(jié)碼格式) response.text(字符串格式) 都是消息體。
4.4三種請(qǐng)求消息體格式: XML,urlencode,JSON,
5.三種鑒權(quán)機(jī)制(cookie,session,token)
鑒權(quán)機(jī)制就是讓服務(wù)器知曉,收到的兩個(gè)請(qǐng)求,是否來自同一個(gè)用戶。這樣才能保證我自己淘寶收藏的東西,不會(huì)跑到其他用戶那。
- http是一種無狀態(tài)協(xié)議(對(duì)事務(wù)處理沒有記憶能力),是無連接的(每次連接只處理一個(gè)請(qǐng)求,用后立即斷開連接),因此需要鑒權(quán)機(jī)制進(jìn)行來接用戶,之前的古老操作是 每次操作都要帶上用戶id,很繁瑣,所以來了cookie,session,token鑒權(quán)機(jī)制
- cookie
a. cookie的本質(zhì)是一小段的文本信息,格式的字典,key=value。cookie的名稱不是國(guó)定的,是由開發(fā)自定義的。
b. 第一次c訪問s,s將cookie信息放到響應(yīng)頭的Set-cookie中,返給c。
c. 分類:會(huì)話cookie 1保存在內(nèi)存,當(dāng)瀏覽器的會(huì)話關(guān)閉之后自動(dòng)消失。持久cookie :保存在硬盤,只有當(dāng)失效時(shí)間到期了才會(huì)自動(dòng)消失。
d. 當(dāng)客戶端從第2次開始直到后面的所有請(qǐng)求,在請(qǐng)求頭的Cookie都會(huì)自動(dòng)的帶上以上的Cookie的信息。從而實(shí)現(xiàn)鑒權(quán)。
因?yàn)閏ookie是保存在客戶端,可被截獲,對(duì)于支付密碼,銀行卡號(hào)的信息存儲(chǔ)就不安全,so->session,密碼,直接變成了一個(gè)新的字段 - seesion
sessionid ( phpwindid , phpid ,windowsuers ),一般是一個(gè)比較長(zhǎng)的經(jīng)過加密的字符串,sessionid在服務(wù)器和客戶端分別都保存了一份,,然后通過cookie的鑒權(quán)的方式實(shí)現(xiàn)session的鑒權(quán)(sessionid 是存儲(chǔ)在cookie中的)。
安全性 - token
a. 由于京東淘寶用戶大,對(duì)于存儲(chǔ)session的話還是很大,session生命周期默認(rèn)30分鐘,所以大項(xiàng)目時(shí),滿足不了需求
b. 小程序,app,公眾號(hào)是沒有瀏覽器的,是不好傳cookie,session的,so token
5.1session機(jī)制
網(wǎng)站服務(wù)程序怎么知道每個(gè)HTTP請(qǐng)求(比如付費(fèi) HTTP 請(qǐng)求)對(duì)應(yīng)的是哪個(gè)客戶的呢?—>建立seesion機(jī)制(會(huì)話機(jī)制)
使用session 機(jī)制區(qū)分用戶,當(dāng)然還有其他機(jī)制
實(shí)現(xiàn):
- 我們可以通過查找字典的方式獲取響應(yīng)頭的cookie,然后加到請(qǐng)求頭中
- 使用requests.Session()類,直接記錄cookie
# 創(chuàng)建 Session 對(duì)象
s = requests.Session()
# 通過 Session 對(duì)象 發(fā)送請(qǐng)求
response = s.post("http://127.0.0.1/api/mgr/signin",
data={
'username': 'byhy',
'password': '88888888'
})
printResponse(response)
# 通過 Session 對(duì)象 發(fā)送請(qǐng)求
response = s.get("http://127.0.0.1/api/mgr/customers",
params={
'action' : 'list_customer',
'pagesize' : 10,
'pagenum' : 1,
'keywords' : '',
})
printResponse(response)
5.2python實(shí)現(xiàn)session
import requests
# 打印請(qǐng)求消息, 參數(shù)為 PreparedRequest 對(duì)象
def pretty_print_request(req):
if req.body == None:
msgBody = ''
else:
msgBody = req.body
print(
'{}\n{}\n{}\n\n{}'.format(
'\n\n----------- 發(fā)送請(qǐng)求 -----------',
req.method + ' ' + req.url,
'\n'.join('{}: {}'.format(k, v) for k, v in req.headers.items()),
msgBody,
))
# 打印響應(yīng)消息
def pretty_print_response(res):
print(
'{}\nHTTP/1.1 {}\n{}\n\n{}'.format(
'\n\n----------- 得到響應(yīng) -----------',
res.status_code,
'\n'.join('{}: {}'.format(k, v) for k, v in res.headers.items()),
res.text,
))
req = requests.Request(
'post',
'http://www.baidu.com',
headers={
'head1':'value1',
'head2':'value2',
},
data={
'item1':'body-value1',
'item2':'body-value2',
})
prepared = req.prepare()
pretty_print_request(prepared)
session = requests.Session()
r = session.send(prepared)
pretty_print_response(r)
Pytest測(cè)試框架下常用函數(shù)
1.yield
yield與return類似,返回一定的值,被yield修飾的函數(shù)就是生成器,使用方法:下圖第三點(diǎn)
list是直接創(chuàng)建,一次性封裝666666個(gè)元素;生成器generator記住的是規(guī)則,調(diào)用生成器方法.next可以一直執(zhí)行。
生成器生成的列表時(shí)間很短。
生成器generator記住的是規(guī)則,調(diào)用生成器方法.next可以一直執(zhí)行
2.package下的_init_.py
3.裝飾器(語法糖)-就是函數(shù)
(裝飾器函數(shù)中輸入函數(shù),對(duì)輸入函數(shù)的優(yōu)化處理)
@property:對(duì)函數(shù)處理后,可以類似調(diào)用屬性的方法來獲取值,不用再使用方法的調(diào)用
如方法def name(self): return self._name 直接可以u(píng)ser().name 調(diào)用此方法
4.with語句:用于對(duì)象上下文的管理
創(chuàng)建的類必須有enter和exit方法才能被with使用文章來源:http://www.zghlxwxcb.cn/news/detail-436132.html
await
async
log
裝飾器文章來源地址http://www.zghlxwxcb.cn/news/detail-436132.html
到了這里,關(guān)于基于python實(shí)現(xiàn)Web自動(dòng)化測(cè)試(selenium)、API自動(dòng)化測(cè)試(requests)&附學(xué)習(xí)視頻的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!