python接口自動化之使用token傳入到header消息頭中
python接口自動化之token傳入到header消息頭中
(1)創(chuàng)建登錄請求獲取token
#登錄界面的測試用例類
#導入日志類便于設置日志信息
from Logs.Log import Logger
#導入配置文件類讀取公共數(shù)據(jù)
from Readini.Read import Readini
#導入excel類便于讀取excel中的數(shù)據(jù)
from DataExcel.readExcel import ExcelUtil
#導入request包
import requests
import json
from Public.PageObject import SendRequest
#導入json包
import unittest
import json
from builtins import str
#設置讀取登錄中相關(guān)參數(shù)
excel = ExcelUtil(Readini().get_ini_value('Excel','exccelini')).dict_data()
def token():
#設置消息頭信息
header=eval(excel[0]['header'])
# 設置url數(shù)據(jù)
url = excel[0]['Url']
#設置參數(shù)信息
param=excel[0]['payload']
# 將設置的參數(shù)信息轉(zhuǎn)換為json格式的數(shù)據(jù)
#設置請求類型
type=excel[0]['Method']
#發(fā)送post登錄請求
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公共初始化類并傳入獲取的token數(shù)據(jù)
from selenium import webdriver
import unittest
#創(chuàng)建unitest初始化公共類
from Logs.Log import Logger
log=Logger('接口自動化執(zhí)行結(jié)果').getlog()
from TOKEN.PublicToken import token
import json
class TestBase(unittest.TestCase):
#接口初始化開始
@classmethod
def setUpClass(cls):
log.info('接口自動化測試開始')
#傳入獲取的token作為初始化的token數(shù)據(jù)
cls.token=token()
#接口初始化結(jié)束
@classmethod
def tearDownClass(cls):
log.info('接口自動化測試結(jié)束')
if __name__ == '__main__':
unittest.main() #主函數(shù) 用于執(zhí)行編寫好的程序(3)向header中傳入初始化時獲取的token
導入日志類便于設置日志信息
from Logs.Log import Logger
#導入配置文件類讀取公共數(shù)據(jù)
from Readini.Read import Readini
#導入excel類便于讀取excel中的數(shù)據(jù)
from DataExcel.readExcel import ExcelUtil
#設置讀取登錄中相關(guān)參數(shù)
excel = ExcelUtil(Readini().get_ini_value('Excel','exccelini')).dict_data()
#設置日志類型參數(shù)
log = Logger('登錄接口日志執(zhí)行結(jié)果').getlog()
#繼承unittest初始化類
from ChanDao.TestBase import TestBase
#導入request包
import requests
from Public.PageObject import SendRequest
#導入json包
import unittest
import json
from Readini.Read import Readini
class Pinlun(TestBase):
def test_1_pinglun_success(self):
'''登錄成功'''
#設置消息頭信息
header=eval(Readini().get_ini_value('header','headers'))
#eval(excel[0]['header'])
#像headers頭中添加token信息
header['Admin-Authorization']=self.token
log.info(header)
# 設置url數(shù)據(jù)
url ='http://localhost:8090/api/admin/posts/comments'
#log.info('退出的url地址是:' + url)
#設置參數(shù)信息
param={'page':'0','size':'10','keyword':'68'}
# 將設置的參數(shù)信息轉(zhuǎn)換為json格式的數(shù)據(jù)
# log.info(param)
#設置請求類型
type='get'
log.info(type)
#發(fā)送get登錄請求
response=SendRequest().send_request(type,url,param,header=header)
print(response.json())
#獲取登錄響應狀態(tài)碼,做斷言
# self.assertEqual(response.status_code,excel[0]['StatusCode'])
# log.info('響應狀態(tài)碼為200,登錄成功')
#設置主函數(shù)執(zhí)行編寫的登錄腳本
if __name__ == '__main__':
unittest.main()注意:
1.獲取token需要調(diào)通登錄接口
2.將token傳入到unittest的Setup函數(shù)中
3.最后將token傳入到header中
python接口自動化之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] # 正則取出來的值是 列表 類型,所以要進行列表取值
print(token)結(jié)合框架使用token

python里面有個全局變量global,但這個只是針對于在同一個.py里才有效,跨腳本就不起作用了。
整體的思路:
- 1、登錄后返回 token,把 token 寫入 yaml 文件中,yaml 文件放在公共模塊 commen 中
- 2、需要 token 的時候(一般是調(diào)用寫用例的時候),在初始化中讀取 yaml 文件中最新的 token 值
- 3、每個用例的 package 執(zhí)行的時候去調(diào)用獲取 token
- 4、最后執(zhí)行所有用例,生成報告,發(fā)送郵件等
所以先把讀寫 yaml 的方法封裝好
headle.py
# -*- coding:utf-8 -*-import os, yaml
defwrite_yaml(token):
cur = os.path.dirname(os.path.realpath(__file__)) # 獲取當前路徑
yaml_path = os.path.join(cur, "token.yaml") # 獲取yaml文件的路徑print(yaml_path)
t = {"token": token} # 寫入的內(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)這個用法,因為覺得很不安全,5.1版本之后就修改了需要指定Loader,通過默認加載器(FullLoader)禁止執(zhí)行任意函數(shù)
Loader=yaml.FullLoader 加上這行代碼,告警就沒了
"""
d = d["token"]
return d
if __name__ == '__main__':
r = write_yaml("token的值")封裝接口的時候,把 token 設置成變量

user.py
# -*- coding:utf-8 -*-import requests
defuser_info(host, token):
url = host + '/pub/api/v1/web/user_info'
headers = {"token": token} # token 放在請求頭
r = requests.get(url=url, headers=headers)
return r編寫用例的時候先獲取 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__)) # 獲取當前路徑# 獲取 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 寫入 yaml 文件
- 3、執(zhí)行用例初始化的時候先獲取 token
- 4、執(zhí)行用例生成報告
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項目測試報告",
description="xx項目的測試報告"
)
runner.run(all_case())
fb.close()
if __name__ == '__main__':
# 調(diào)用登錄獲取token
token = login("host", "登錄的賬號", "密碼")
# 把token寫入 yaml 文件
write_yaml(token)
# 執(zhí)行用例的時候會讀取 yaml 中的token,case文件下 test_user_info.py 的
run_case_report()總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python 使用事件對象asyncio.Event來同步協(xié)程的操作
這篇文章主要介紹了python 使用事件對象asyncio.Event來同步協(xié)程的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
python中常用排序操作sort方法和sorted函數(shù)的使用超詳細講解(內(nèi)置模板代碼!)
這篇文章主要介紹了Python中的排序方法,包括sort()方法和sorted()函數(shù)的使用,sort()方法用于列表,對原列表進行排序,文章還提供了一些排序案例模板代碼,以解決實際問題,需要的朋友可以參考下2025-02-02
Tensorflow分類器項目自定義數(shù)據(jù)讀入的實現(xiàn)
這篇文章主要介紹了Tensorflow分類器項目自定義數(shù)據(jù)讀入的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02
pytorch模型轉(zhuǎn)換為onnx可視化(使用netron)
netron 是一個非常好用的網(wǎng)絡結(jié)構(gòu)可視化工具,但是netron對pytorch模型的支持還不成熟,這篇文章主要介紹了pytorch模型轉(zhuǎn)換為onnx,并使用netron可視化,需要的朋友可以參考下2023-05-05
python使用range函數(shù)計算一組數(shù)和的方法
這篇文章主要介紹了python使用range函數(shù)計算一組數(shù)和的方法,涉及Python中range函數(shù)的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-05-05

