python接口自動(dòng)化之使用token傳入到header消息頭中
python接口自動(dòng)化之token傳入到header消息頭中
(1)創(chuàng)建登錄請(qǐng)求獲取token
#登錄界面的測(cè)試用例類(lèi) #導(dǎo)入日志類(lèi)便于設(shè)置日志信息 from Logs.Log import Logger #導(dǎo)入配置文件類(lèi)讀取公共數(shù)據(jù) from Readini.Read import Readini #導(dǎo)入excel類(lèi)便于讀取excel中的數(shù)據(jù) from DataExcel.readExcel import ExcelUtil #導(dǎo)入request包 import requests import json from Public.PageObject import SendRequest #導(dǎo)入json包 import unittest import json from builtins import str #設(shè)置讀取登錄中相關(guān)參數(shù) excel = ExcelUtil(Readini().get_ini_value('Excel','exccelini')).dict_data() def token(): #設(shè)置消息頭信息 header=eval(excel[0]['header']) # 設(shè)置url數(shù)據(jù) url = excel[0]['Url'] #設(shè)置參數(shù)信息 param=excel[0]['payload'] # 將設(shè)置的參數(shù)信息轉(zhuǎn)換為json格式的數(shù)據(jù) #設(shè)置請(qǐng)求類(lèi)型 type=excel[0]['Method'] #發(fā)送post登錄請(qǐng)求 response=SendRequest().send_request(type,url,data=param,header=header) #獲取token數(shù)據(jù) token=response.json()['data']['access_token'] #將token數(shù)據(jù)轉(zhuǎn)換為字符串的格式 return str(token)
(2)創(chuàng)建unittest公共初始化類(lèi)并傳入獲取的token數(shù)據(jù)
from selenium import webdriver import unittest #創(chuàng)建unitest初始化公共類(lèi) from Logs.Log import Logger log=Logger('接口自動(dòng)化執(zhí)行結(jié)果').getlog() from TOKEN.PublicToken import token import json class TestBase(unittest.TestCase): #接口初始化開(kāi)始 @classmethod def setUpClass(cls): log.info('接口自動(dòng)化測(cè)試開(kāi)始') #傳入獲取的token作為初始化的token數(shù)據(jù) cls.token=token() #接口初始化結(jié)束 @classmethod def tearDownClass(cls): log.info('接口自動(dòng)化測(cè)試結(jié)束') if __name__ == '__main__': unittest.main() #主函數(shù) 用于執(zhí)行編寫(xiě)好的程序
(3)向header中傳入初始化時(shí)獲取的token
導(dǎo)入日志類(lèi)便于設(shè)置日志信息 from Logs.Log import Logger #導(dǎo)入配置文件類(lèi)讀取公共數(shù)據(jù) from Readini.Read import Readini #導(dǎo)入excel類(lèi)便于讀取excel中的數(shù)據(jù) from DataExcel.readExcel import ExcelUtil #設(shè)置讀取登錄中相關(guān)參數(shù) excel = ExcelUtil(Readini().get_ini_value('Excel','exccelini')).dict_data() #設(shè)置日志類(lèi)型參數(shù) log = Logger('登錄接口日志執(zhí)行結(jié)果').getlog() #繼承unittest初始化類(lèi) from ChanDao.TestBase import TestBase #導(dǎo)入request包 import requests from Public.PageObject import SendRequest #導(dǎo)入json包 import unittest import json from Readini.Read import Readini class Pinlun(TestBase): def test_1_pinglun_success(self): '''登錄成功''' #設(shè)置消息頭信息 header=eval(Readini().get_ini_value('header','headers')) #eval(excel[0]['header']) #像headers頭中添加token信息 header['Admin-Authorization']=self.token log.info(header) # 設(shè)置url數(shù)據(jù) url ='http://localhost:8090/api/admin/posts/comments' #log.info('退出的url地址是:' + url) #設(shè)置參數(shù)信息 param={'page':'0','size':'10','keyword':'68'} # 將設(shè)置的參數(shù)信息轉(zhuǎn)換為json格式的數(shù)據(jù) # log.info(param) #設(shè)置請(qǐng)求類(lèi)型 type='get' log.info(type) #發(fā)送get登錄請(qǐng)求 response=SendRequest().send_request(type,url,param,header=header) print(response.json()) #獲取登錄響應(yīng)狀態(tài)碼,做斷言 # self.assertEqual(response.status_code,excel[0]['StatusCode']) # log.info('響應(yīng)狀態(tài)碼為200,登錄成功') #設(shè)置主函數(shù)執(zhí)行編寫(xiě)的登錄腳本 if __name__ == '__main__': unittest.main()
注意:
1.獲取token需要調(diào)通登錄接口
2.將token傳入到unittest的Setup函數(shù)中
3.最后將token傳入到header中
python接口自動(dòng)化之token的處理
提取token
1、json解析提取
# -*- coding:utf-8 -*- import requests host = "" user = "" pwd = "" url = host + "/pub/api/v1/web/web_login" body = { "phone": user, "pwd": pwd } r = requests.post(url=url, data=body).json() # .json() 就是 json 解析,把json格式轉(zhuǎn)為字典 token = r["data"]["token"] # 字典取值 print(token)
2、正則提取json
# -*- coding:utf-8 -*- import requests, re host = "" user = "" pwd = "" url = host + "/pub/api/v1/web/web_login" body = { "phone": user, "pwd": pwd } r = requests.post(url=url, data=body).text print(r) token = re.findall('"token":"(.+?)"', r) token = token[0] # 正則取出來(lái)的值是 列表 類(lèi)型,所以要進(jìn)行列表取值 print(token)
結(jié)合框架使用token
python里面有個(gè)全局變量global,但這個(gè)只是針對(duì)于在同一個(gè).py里才有效,跨腳本就不起作用了。
整體的思路:
- 1、登錄后返回 token,把 token 寫(xiě)入 yaml 文件中,yaml 文件放在公共模塊 commen 中
- 2、需要 token 的時(shí)候(一般是調(diào)用寫(xiě)用例的時(shí)候),在初始化中讀取 yaml 文件中最新的 token 值
- 3、每個(gè)用例的 package 執(zhí)行的時(shí)候去調(diào)用獲取 token
- 4、最后執(zhí)行所有用例,生成報(bào)告,發(fā)送郵件等
所以先把讀寫(xiě) yaml 的方法封裝好
headle.py
# -*- coding:utf-8 -*-import os, yaml defwrite_yaml(token): cur = os.path.dirname(os.path.realpath(__file__)) # 獲取當(dāng)前路徑 yaml_path = os.path.join(cur, "token.yaml") # 獲取yaml文件的路徑print(yaml_path) t = {"token": token} # 寫(xiě)入的內(nèi)容withopen(yaml_path, 'w', encoding='utf-8') as f: yaml.dump(t, stream=f, allow_unicode=True) defget_yaml(yaml_file): # yaml_file = "D:\\code\\api_test\\commen\\token.yaml" f = open(yaml_file, 'r', encoding='utf-8') cfg = f.read() d = yaml.load(cfg, Loader=yaml.FullLoader) """ 用load轉(zhuǎn)字典 yaml5.1版本后棄用了yaml.load(file)這個(gè)用法,因?yàn)橛X(jué)得很不安全,5.1版本之后就修改了需要指定Loader,通過(guò)默認(rèn)加載器(FullLoader)禁止執(zhí)行任意函數(shù) Loader=yaml.FullLoader 加上這行代碼,告警就沒(méi)了 """ d = d["token"] return d if __name__ == '__main__': r = write_yaml("token的值")
封裝接口的時(shí)候,把 token 設(shè)置成變量
user.py
# -*- coding:utf-8 -*-import requests defuser_info(host, token): url = host + '/pub/api/v1/web/user_info' headers = {"token": token} # token 放在請(qǐng)求頭 r = requests.get(url=url, headers=headers) return r
編寫(xiě)用例的時(shí)候先獲取 yaml 文件中 token 的值
test_user_info.py
# -*- coding:utf-8 -*-from interface.user import user_info from commen.headle_token import * import unittest, os current_path = os.path.dirname(os.path.realpath(__file__)) # 獲取當(dāng)前路徑# 獲取 token 的路徑 token_path = os.path.join(current_path, "commen") token_path = os.path.join(token_path, "token.yaml") classTestUserInfo(unittest.TestCase): @classmethoddefsetUpClass(cls): cls.token = get_yaml(token_path) print("獲取token") print(cls.token) deftest_user_info_success(self): r = user_info("https://api.xdclass.net", self.token) print(r.text) if __name__ == '__main__': unittest.main()
主程序
- 1、登錄返回token
- 2、token 寫(xiě)入 yaml 文件
- 3、執(zhí)行用例初始化的時(shí)候先獲取 token
- 4、執(zhí)行用例生成報(bào)告
run_case_report.py
# -*- coding:utf-8 -*- import unittest, os from commen import HTMLTestRunner from interface.login import login from commen.headle_token import * current_path = os.path.dirname(os.path.realpath(__file__)) case_path = os.path.join(current_path, "case") report_path = os.path.join(current_path, "report") report = os.path.join(report_path, "report.html") def all_case(): discover = unittest.defaultTestLoader.discover(case_path, pattern='test*.py') print(discover) return discover def run_case_report(): fb = open(report, "wb") runner = HTMLTestRunner.HTMLTestRunner( stream=fb, title="xx項(xiàng)目測(cè)試報(bào)告", description="xx項(xiàng)目的測(cè)試報(bào)告" ) runner.run(all_case()) fb.close() if __name__ == '__main__': # 調(diào)用登錄獲取token token = login("host", "登錄的賬號(hào)", "密碼") # 把token寫(xiě)入 yaml 文件 write_yaml(token) # 執(zhí)行用例的時(shí)候會(huì)讀取 yaml 中的token,case文件下 test_user_info.py 的 run_case_report()
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python系統(tǒng)監(jiān)控模塊psutil功能與經(jīng)典用法分析
這篇文章主要介紹了Python系統(tǒng)監(jiān)控模塊psutil功能與經(jīng)典用法,簡(jiǎn)單講述了psutil模塊的功能、原理并結(jié)合具體實(shí)例形式分析了Python使用psutil模塊針對(duì)CPU、內(nèi)存、磁盤(pán)、網(wǎng)絡(luò)等信息的讀取相關(guān)操作技巧,需要的朋友可以參考下2018-05-05從CentOS安裝完成到生成詞云python的實(shí)例
下面小編就為大家分享一篇從CentOS安裝完成到生成詞云python的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助2017-12-12關(guān)于keras中keras.layers.merge的用法說(shuō)明
這篇文章主要介紹了關(guān)于keras中keras.layers.merge的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05通過(guò)Python讀取照片的Exif信息解鎖圖片背后的故事
這篇文章主要為大家介紹了通過(guò)Python讀取照片的Exif信息解鎖圖片背后的故事探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12socket + select 完成偽并發(fā)操作的實(shí)例
下面小編就為大家?guī)?lái)一篇socket + select 完成偽并發(fā)操作的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08