2023最新合集Python自動(dòng)化測(cè)試開發(fā)框架【全棧/實(shí)戰(zhàn)/教程】合集精華,學(xué)完

一、目前軟件測(cè)試的市場(chǎng)行情以及測(cè)試人員能力標(biāo)準(zhǔn)。
這兩天我聽了幾個(gè)去京東、平安銀行,阿里等大廠的招聘錄音:總結(jié)一下:
一般這些大廠業(yè)務(wù)測(cè)試:5-6成,接口,自動(dòng)化,性能:4-5成,流程規(guī)范:1成
從上面的需求我們不難看出目前市面上對(duì)測(cè)試人員的要求:綜合型的測(cè)試人才,側(cè)重業(yè)務(wù)能力(京東是小B端業(yè)務(wù),平安銀行信用卡業(yè)務(wù)),代碼能力(在自動(dòng)化框架這一塊有一定的建樹)以及開發(fā)思維
(代碼的封裝能力)。
?
而接口測(cè)試或者接口自動(dòng)化是每一個(gè)面試中都必問(wèn)的環(huán)節(jié)。比如:(只口述,不打字) 1.主流接口測(cè)試工具:????????????????????Postman+Newman+Jenkins持續(xù)集成接口自動(dòng)化(基于Javascript語(yǔ)言) Jmeter+Ant+Jenkins持續(xù)集成接口自動(dòng)化(基于Java語(yǔ)言)
Apifox+Apifox-cli+Jenkins持續(xù)集成接口自動(dòng)化(基于Javascript語(yǔ)言)
?
2.接口自動(dòng)化測(cè)試以及接口自動(dòng)化測(cè)試平臺(tái):(一般適用于大中型的項(xiàng)目或者公司) python+requests+pytest+yaml+allure+logging+jenkins接口自動(dòng)化。
開發(fā)自動(dòng)化測(cè)試平臺(tái)。
?
既然我們有postman,jmeter,apifox等工具都可以實(shí)現(xiàn)接口測(cè)試,為什么我們要封裝框架或者是開發(fā)測(cè)試平臺(tái)???????????????????????????????????????工具弊端如下:??1.敏捷開發(fā)接口數(shù)量巨大,如何實(shí)現(xiàn)團(tuán)隊(duì)合作和版本控制(如果是聯(lián)網(wǎng)協(xié)作,安全問(wèn)題?)。
2.功能太死板,有些接口功能難以實(shí)現(xiàn)(比如說(shuō):自定義加密,RSA加密,簽名等)。
3.當(dāng)接口項(xiàng)目當(dāng)中出現(xiàn)了多種協(xié)議的接口。
4.沒(méi)有辦法生成美觀的測(cè)試報(bào)告以及日志監(jiān)控的實(shí)現(xiàn)。
5.框架或平臺(tái)可以自定義功能并推廣到所有的項(xiàng)目中復(fù)用。
基于目前的市場(chǎng)形式以及行業(yè)需求,所以從今天開始我們就和大家講三天的接口自動(dòng)化VIP課程,希望對(duì)大家找工作和跳槽有所幫助,同時(shí)也希望大家能夠認(rèn)真的學(xué)完并且動(dòng)手實(shí)踐起來(lái)。
?
二、全面熟練Requests庫(kù)以及底層方法調(diào)用邏輯??????????????????1.requests庫(kù)是用來(lái)發(fā)送HTTP請(qǐng)求,接收HTTP響應(yīng)的Python第三方庫(kù),主要用于做接口自動(dòng)化測(cè)試,使用前需要安裝:
??
2.?詳解Requests模塊常用方法:
?
1?
def?get(url,?params=None,
2?url:接口請(qǐng)求地址
**kwargs): 發(fā)送get請(qǐng)求
3?params:是get請(qǐng)求用于傳參,這個(gè)參數(shù)會(huì)自動(dòng)的以?的方式加到url之后,多個(gè)參數(shù)之間用&分割。
4?**kwargs:可變長(zhǎng)度字典參數(shù)
5
6?def?post(url, data=None, json=None, **kwargs):?發(fā)送post請(qǐng)求
7?data:用于傳參
8?json: 用于傳參
9?files: 文件上傳
10
11?基于Postman:
12?form-data:?既有表單參數(shù)也有文件上傳 files
13?Content-Type:multipart/form-data
14?x-www-form-urlencoded 表單 data
15?Content-Type:application/x-www-form-urlencoded?(data)
16?raw:?json(json),xml(data),text(data)
17?Content-Type:application/json (json)
18?Content-Type:text/plain (data)
19?Content-Type:application/javascript?(data)
20?Content-Type:text/html (data)
21?Content-Type:application/xml (data)
22?binay:二進(jìn)制文件上傳(data)
23?Content-Type:application/octrent-stream (data)
24
25?def?put(url, data=None, **kwargs): 發(fā)送put請(qǐng)求
26?def?delete(url, **kwargs): 發(fā)送delete請(qǐng)求
27
28?requests模塊下的:
29?def?request(method, url, **kwargs): 發(fā)送任意請(qǐng)求/它是get,post,put,delete的底層方法。
?
30
31?def session(): 獲得一個(gè)session對(duì)象
32?session對(duì)象的:
33?def request( session對(duì)象的request方法
34?self,
35?method, 請(qǐng)求方式?get?post put delete
36?url, 請(qǐng)求URL地址,接口文檔標(biāo)準(zhǔn)的接口請(qǐng)求地址
37?params=None, params參數(shù):請(qǐng)求數(shù)據(jù)中的鏈接,常見的一個(gè)get請(qǐng)求,請(qǐng)求參數(shù)都是放在url地址
38?data=None, data參數(shù):請(qǐng)求數(shù)據(jù),參數(shù)為表單的數(shù)據(jù)格式
39?json=None, json參數(shù):接口常見的數(shù)據(jù)請(qǐng)求格式
40?headers=None, 請(qǐng)求頭:請(qǐng)求頭信息 ,http請(qǐng)求中,編碼方式等內(nèi)容的添加
41?cookies=None, cookie信息:保存用戶的登錄信息。比如做一些充值功能,但是需要用戶已經(jīng)登錄
42?files=None, 文件上傳
43
44?auth=None, 鑒權(quán)的意思,接口設(shè)置操作權(quán)限
45?timeout=None, 超時(shí)處理
46?allow_redirects=True, 重定向,請(qǐng)求不成功,再次請(qǐng)求(該功能并不是很常用)
47?proxies=None, 設(shè)置代理
48?hooks=None, 鉤子
49?stream=None, 文件下載功能,通過(guò)請(qǐng)求方式,下載文件,進(jìn)行驗(yàn)證
50?verify=None, 證書驗(yàn)證?1.要么請(qǐng)求忽略證書 2.要么加載證書地址
51?cert: CA證書
52?):
53
54?requests.request()和session.request()的區(qū)別在于:
55?前者的每個(gè)請(qǐng)求都是獨(dú)立,后者會(huì)自動(dòng)的關(guān)聯(lián)所有的請(qǐng)求的cookie信息(類似于jmeter的http cookie管理器
?
?
3.?requests模塊中的response對(duì)象的屬性和方法?編寫一個(gè)簡(jiǎn)單的get案例之后講解Response對(duì)象。
使用requests方法后會(huì)返回一個(gè)Response對(duì)象,存儲(chǔ)服務(wù)器的返回信息。Response返回信息如下:
?
?
?
三、Requests接口自動(dòng)化測(cè)試實(shí)戰(zhàn)?1.get請(qǐng)求接口???????????????2.get請(qǐng)求接口(需要接口關(guān)聯(lián))????3.post請(qǐng)求接口(包括json傳參和data傳參) 4.文件上傳接口
5.訪問(wèn)phpwind首頁(yè)接口(正則表達(dá)式應(yīng)用)????????????6.登錄phpwind接口(包括:請(qǐng)求頭,cookie鑒權(quán),session鑒權(quán))
?
1?
class TestApi:
?
2
3?#類變量
4?access_token?=?""
5?csrf_token =?""
6?session?= requests.session() #創(chuàng)建會(huì)話對(duì)象
7
8?#get請(qǐng)求接口
9?def test_get_token(self):
10?urls =?"https://api.weixin.qq.com/cgi-bin/token"
11?datas?=?{
12?"grant_type":"client_credential",
13?"appid":"wx6b11b3efd1cdc290",
14?"secret":"106a9c6157c4db5f6029918738f9529d"
15 }
16?res =?requests.get(url=urls,params=datas)
17?result =?res.json()
18?TestApi.access_token?=?result["access_token"]
19?print(result["access_token"])
20?#在第一個(gè)接口里面獲取到access_token鑒權(quán)碼
21
22?#get請(qǐng)求接口(需要接口關(guān)聯(lián))
23?def test_select_flag(self):
24?urls =?"https://api.weixin.qq.com/cgi-bin/tags/get"
25?datas?=?{
26?"access_token":?TestApi.access_token
27 }
?
28 res
=?requests.get(url=
urls,?params=
datas)
29 print(res.json())
?
30
31?#post請(qǐng)求接口(包括json傳參和data傳參)
32?def test_edit_flag(self):
33?urls =?"https://api.weixin.qq.com/cgi-bin/tags/update"
34?ps?=?{
35?"access_token":?TestApi.access_token
36 }
37?datas?=?{"tag":{"id":7206,"name":"beibei"+str(int(time.time()))}}
38?res?=?requests.post(url=urls,data=json.dumps(datas),params=ps)
39?print(res.json())
?
40
41?#文件上傳接口
42?def test_file_upload(self):
43?urls?=?"https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token="+TestApi
44?datas?=?{
45?"media":open(r"E:\shu.png","rb")
46 }
47?res =?requests.post(url=urls,files=datas)
48?print(res.json())
?
49
50?#訪問(wèn)phpwind首頁(yè)接口(正則表達(dá)式應(yīng)用)
51?def test_phpwind(self):
52 urls =?"http://47.107.116.139/phpwind"
53?#res?=?requests.get(url=urls)
54?res =?TestApi.session.get(url=urls)
55?result=res.text
56?TestApi.csrf_token?=?re.search('name="csrf_token"?value="(.*?)"',result).group(1
57?print(TestApi.csrf_token)
58
59?#登錄接口(包括:請(qǐng)求頭,cookie鑒權(quán),session鑒權(quán))
60?def test_login(self):
61?urls=?"http://47.107.116.139/phpwind/index.php?m=u&c=login&a=dorun"
62?datas?=?{
63?"username":"admin",
64?"password":"msxy",
65?"csrf_token":TestApi.csrf_token,
66?"backurl":"http://47.107.116.139/phpwind/",
?
?
?
接口關(guān)聯(lián)必用的三種方式以及對(duì)應(yīng)python庫(kù)詳解:
1.通過(guò)類變量保存中間變量實(shí)現(xiàn)接口關(guān)聯(lián)。
2.通過(guò)單獨(dú)的文件保存中間變量實(shí)現(xiàn)接口關(guān)聯(lián)。
3.極限封裝成零代碼方式提取和使用實(shí)現(xiàn)接口關(guān)聯(lián)。
?
(1)?正則提取(正則只能夠提取字符串的數(shù)據(jù))?re.seach:只匹配一個(gè)值,通過(guò)下標(biāo)[1]取值,沒(méi)有匹配到返回None????re.findall:匹配多個(gè)值,返回列表list,多個(gè)值通過(guò)下標(biāo)取值,沒(méi)有匹配到返回None
??
?
(2)?JsonPath提?。?/strong>jsonpath只能夠提取json格式的數(shù)據(jù))
jsonpath.jsonpath,返回的是一個(gè)列表,通過(guò)下標(biāo)取值,沒(méi)有找到返回None
?
語(yǔ)法規(guī)則:
(1)?$?根節(jié)點(diǎn)
(2)?.或者[] 用于獲取子節(jié)點(diǎn)的對(duì)象。如:
$.jiaoyu
$["mashang"]
區(qū)別在于[]的方式它的功能更強(qiáng)大,它可以同時(shí)取多個(gè)節(jié)點(diǎn):如:
$["mashang","jiaoyu"]
(3)?.. 表示通過(guò)相對(duì)路徑取值,通過(guò)遞歸取值。
$..name
(4)?*?通配符
$.*?匹配到根節(jié)點(diǎn)下所有的節(jié)點(diǎn)的值。
$..*?遞歸匹配到根節(jié)點(diǎn)下所有的對(duì)象或者。
(5)?數(shù)組的處理方式,它是通過(guò)[]來(lái)處理,如:
$.mashang[0].student[1].name 0代表取數(shù)組的第1個(gè)值。 切片取值:從start(包含)開始到end(不包含)結(jié)束。如:
$.mashang[1:3]?下標(biāo)從1開始到2
$.mashang[:3] 下標(biāo)從0開始到2
$.mashang[1:] 下標(biāo)從1開始到最后的下標(biāo)
$.mashang[-2:-1]?-1是倒數(shù)第1個(gè),-2倒數(shù)第2個(gè)。
?
四、接口自動(dòng)化框架封裝:
目的:簡(jiǎn)化接口自動(dòng)化的落地實(shí)施,統(tǒng)一化,標(biāo)準(zhǔn)化,企業(yè)期望達(dá)到:不懂代碼的團(tuán)隊(duì)也能夠通過(guò)框架實(shí)現(xiàn)接口自動(dòng)化測(cè)試。
?
(1)、接口自動(dòng)化統(tǒng)一請(qǐng)求封裝為什么需要封裝統(tǒng)一接口請(qǐng)求: 1.去除重復(fù)的,冗余的代碼。
2.實(shí)現(xiàn)統(tǒng)一的異常處理和日志監(jiān)控。封裝代碼如下:
?