前言
場(chǎng)景說(shuō)明
在面試接口自動(dòng)化時(shí),經(jīng)常會(huì)問(wèn),其他接口調(diào)用的前提條件是當(dāng)前用戶必須是登錄狀態(tài),如何處理接口依賴?
在此之前我們介紹過(guò)session管理器保存會(huì)話狀態(tài)。如果接口請(qǐng)求需要攜帶token,那么又如果處理呢?
未登錄狀態(tài)下,直接請(qǐng)求充值接口的異常場(chǎng)景:
import unittest
import requests
class TestRecharge(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def test_recharge(self):
url = 'http://127.0.0.1:8888/recharge'
payload = {
"member_id": 100004312,
"amount": 80
}
res = requests.post(url,json=payload)
print(res.json())
if __name__ == '__main__':
unittest.main()
運(yùn)行結(jié)果如下:
{'code': 1003, 'msg': '未授權(quán)或token已過(guò)期'}
token處理思路
在處理之前,token靈魂三連問(wèn):
如何獲取token?
獲取的token如何管理?
其他接口如何攜帶token?
思路如下:
抽取登錄接口返回值中的token;
使用全局變量存儲(chǔ)token。token可以存到y(tǒng)aml或者json或者ini的配置文件里,以下介紹將token作為類屬性;
其他接口將token值放入請(qǐng)求頭,發(fā)送請(qǐng)求;
JsonPath基本用法
我們需要從登錄接口中提取出token,這里介紹JsonPath基本用法。
JsonPath介紹:
JsonPath為Json文檔提供了解析能力,通過(guò)使用JsonPath,你可以方便的查找節(jié)點(diǎn)、獲取想要的數(shù)據(jù),JsonPath是Json版的XPath。
JsonPath語(yǔ)法:
JsonPath | 說(shuō)明 |
---|---|
$ | 文檔根元素 |
@ | 當(dāng)前元素 |
.或[] | 匹配下級(jí)元素 |
… | 遞歸匹配所有子元素 |
* | 通配符,匹配下級(jí)元素 |
[] | 下標(biāo)運(yùn)算符,根據(jù)索引獲取元素,JsonPath索引從0開始 |
[,] | 連接操作符,將多個(gè)結(jié)果拼接成數(shù)組返回,可以使用索引或別名 |
[start:end:step ] |
數(shù)據(jù)切片操作 |
?() | 過(guò)濾表達(dá)式 |
這么多語(yǔ)法規(guī)范,大家會(huì)覺(jué)得一臉懵逼吧,細(xì)心的小伙伴會(huì)發(fā)現(xiàn)語(yǔ)法中 … 表示遞歸匹配所有子元素,簡(jiǎn)單粗暴,用…獲取所有匹配的子元素,通過(guò)索引拿到想要的值。
JsonPath源碼
def jsonpath(obj, expr, result_type='VALUE', debug=0, use_eval=True):
"""traverse JSON object using jsonpath expr, returning values or paths"""
obj:需要解析的對(duì)象,比如接口的返回值。expr: 匹配的表達(dá)式。
JsonPath實(shí)戰(zhàn)
以下編寫代碼進(jìn)行演示。
from jsonpath import jsonpath
# json格式結(jié)果
res = {
"code": 0,
"msg": "OK",
"data": {
"token_info": {
"token_type": "Bearer",
"expires_in": "2020-05-28 13:07:29",
"token": "eyJhbGciOiJIUzUxAiJ9.eyJtZW1iZZJfaWQiOjEwMDA1MTMxNSwiZXhwIjoxNTkwNjQyNDQ5fQ.s6A7pzLILf9tqpEDAU9wIPGGLGkgKEQ6EBHq26l-eUM5seCb48DWalkE7u16iRZv3uzD5hIDFbw41Jmi9V0T_Q"
}
}
}
# 獲取res中的token
token = jsonpath(res,'$..token')[0]
print(token)
響應(yīng)結(jié)果為:
eyJhbGciOiJIUzUxBiJ9.eyJtZW1iZZJfaWQiOpEwMDA1MTMxNSwiZXhwIjoxNTkwNjQyNDQ5fQ.s6A7pzLILf9tqpEDAU9wIPGGLGkgKEQ6EBHq26l-eUM5seCb48SW
token 依賴實(shí)例
①在config/setting.py配置文件中,配置全局的域名或IP。
class DevConfig():
# 項(xiàng)目的域名或IP
host='http://127.0.0.1:8888'
config = DevConfig()
②在config/config.yaml文件中,存入登錄賬號(hào)。
config.yaml
user:
mobile_phone: '155********'
pwd: '12345678'
③在項(xiàng)目根目錄下,新建文件夾middleware,文件夾下新建文件helper.py,用于處理token。
④首先編寫登錄接口,返回接口數(shù)據(jù)。
helper.py
from common.requests_handler import RequestsHandler
from config.setting import config
from common.yaml_handler import yaml_data
def login():
"""登錄,接口返回token"""
req = RequestsHandler()
res = req.visit('post', config.host+'/login', json=yaml_data['user'])
return res
print(login())
運(yùn)行結(jié)果如下:
{
'code': 0,
'msg': 'OK',
'data': {
'token_info': {
'token_type': 'Bearer',
'expires_in': '2020-05-26 13:31:41',
'token': 'eyJhbGciOiJIUpUxMiJ9.eyJtZW1iZXJfaWQiOjEwMDA1MTMxNSwiZXhwIjoxNTkwNDcxMTAxfQ.4QDNdQ-Wyecvpv7yRnMlCx1ZXpAlb8vpohxHht5OfNcjGn_yTaISyhmn7OMzjMGlz68sJ_uFbCh2NhIaO2p_Lg'
}
}
}
⑤接下來(lái)編寫函數(shù),獲取登錄接口返回值并提取token和token_type進(jìn)行拼接 。這里要使用jsonpath模塊提取返回的token和token_type。
helper.py
def save_token():
"""保存token信息"""
res = login()
token = jsonpath(res,'$..token')[0]
token_type = jsonpath(res,'$..token_type')[0]
token = " ".join([token_type, token])
return token
print(save_token())
運(yùn)行結(jié)果如下:
Bearer eyJhbGciOJIPzUxMiJ9.eyJtZW1iZXJfaWQiOjEwMDA1MTMxNSwiZXhwIjoxNTkwN
⑥最后定義類,將token作為類屬性,整體代碼如下:helper.py
from common.requests_handler import RequestsHandler
from config.setting import config
from common.yaml_handler import yaml_data
from jsonpath import jsonpath
def login():
"""登錄,返回token信息"""
req = RequestsHandler()
res = req.visit('post', config.host+'/login', json=yaml_data['user'])
return res
def save_token():
"""保存token信息"""
res = login()
token = jsonpath(res,'$..token')[0]
token_type = jsonpath(res,'$..token_type')[0]
token = " ".join([token_type, token])
Context.token = token
return token
class Context:
"""將token作為類屬性"""
token = ''
if __name__ == '__main__':
print(save_token())
運(yùn)行結(jié)果如下:
Bearer eyJhbGciOiJIUzUxMiJ9.eyJtZW1iZXJfaWQiOjEwMDA1MTMxNSwiZXhwIjoxNTkwNDcz
⑦充值接口攜帶token請(qǐng)求。
import unittest
import requests
from middleware.helper import Context, save_token
class TestRecharge(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def test_recharge(self):
save_token()
token = Context.token
url = 'http://127.0.0.1:88888/recharge'
payload = {
"member_id": 100051315,
"amount": 80
}
res = requests.post(url,json=payload)
print(res.json())
if __name__ == '__main__':
unittest.main()
運(yùn)行結(jié)果為:
{
'code': 0,
'msg': 'OK',
'data': {
'leave_amount': 240.0,
'mobile_phone': '155********',
}
}
下面是我整理的2023年最全的軟件測(cè)試工程師學(xué)習(xí)知識(shí)架構(gòu)體系圖 |
一、Python編程入門到精通
二、接口自動(dòng)化項(xiàng)目實(shí)戰(zhàn)
三、Web自動(dòng)化項(xiàng)目實(shí)戰(zhàn)
四、App自動(dòng)化項(xiàng)目實(shí)戰(zhàn)
五、一線大廠簡(jiǎn)歷
六、測(cè)試開發(fā)DevOps體系
七、常用自動(dòng)化測(cè)試工具
八、JMeter性能測(cè)試
九、總結(jié)(尾部小驚喜)
不畏風(fēng)雨,砥礪前行,奮斗是實(shí)現(xiàn)夢(mèng)想的道路。堅(jiān)持不懈,追逐遠(yuǎn)方,用毅力創(chuàng)造輝煌的人生。相信自己的力量,燃燒熱情,每一次努力都是邁向成功的跳板,只要心懷勇氣,必將綻放屬于自己的壯麗華章。
擁抱挑戰(zhàn),綻放光芒,奮斗是成就輝煌的征程。砥礪前行,腳踏實(shí)地,用汗水鑄就成功的堅(jiān)固基石。相信自己的能力,不屈不撓,每一次努力都是逼近目標(biāo)的勇敢邁步。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-643316.html
心懷夢(mèng)想,勇往直前,奮斗是砥礪前行的旅程。追逐輝煌,披荊斬棘,用汗水澆灌成就的花朵。相信自我價(jià)值,不畏困難,每一次努力都是向成功逼近的堅(jiān)實(shí)步伐。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-643316.html
到了這里,關(guān)于吐血整理,Python接口自動(dòng)化測(cè)試-接口關(guān)聯(lián)依賴處理(詳細(xì))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!