什么是热加载
热加载:就是在代码运行的过程中动态的调用python中的方法达到获得动态参数的目的。
参数的替换
当我们编写接口自动化时,经常会遇到,某些接口的限制,一些参数不能写死,这时我们就需要将参数动态化
如:接口为创建标签,标签名字不能重复,我们就需要将yaml文件中的参数实现动态化
1、在工程根目录下,创建一个py文件,获取一个随机数
其中random.randint为获取两个范围数值之间的任意随机数字
time.time获取当前的时间戳
reads_token_yaml方法是调用读取鉴权码的方法,由于之后要根据yaml文件的函数名称来调用方法,现在一并写了
#!/usr/bin/python
# -*- coding: UTF-8 -*
import random
import time
from tools.yaml_tool import read_token_yaml
class DebugTalk:
#获得随机数
def get_randon_number(self,min,max):
return random.randint(int(min),int(max))
def get_time(self,key):
return int(time.time())
#读取鉴权码yaml文件--token.yaml
def reads_token_yaml(self,key):
return read_token_yaml(key)
2、获得随机数的方法编写完毕,我们需要将yaml的固定参数,替换成获得随机数的方法
原yaml文件数据:这里读取的鉴权码,是直接通过关键字来读取的,标签创建是写死的
-
name: 创建标签接口
request:
method: post
url: /cgi-bin/tags/create?access_token=${access_token}
json: {"tag":{"name":"广东112313"}}
修改过得yaml文件数据,这里面的获取鉴权码,是要通过方法名来调用,动态参数也通过方法名来调用
-
name: 创建标签接口
request:
method: post
url: /cgi-bin/tags/create?access_token=${reads_token_yaml(access_token)}
json: {"tag":{"name":"广东${get_randon_number(10,1000000)}"}
3、在同一请求中,对方法进行封装
#!/usr/bin/python
# -*- coding: UTF-8 -*
import json
import re
import jsonpath
import requests
from debug_talk import DebugTalk
from tools.yaml_tool import read_base_url_yaml, write_token_yaml, read_token_yaml
class Unifiedrequest:
def __init__(self,two,obj):
self.url=read_base_url_yaml("base",two)
#获取一个对象
self.obj=obj
#数据替换,data为获取到${}中的数据
#数据类型可能(string,int,float,list,dict),需要先数据转换
def read_token(self,data):
if data:
#保存原数据类型
data_type=type(data)
#数据类型转换
if isinstance(data,dict) or isinstance(data,list):
str_data=json.dumps(data)
else:
str_data=str(data)
for ce in range(1,str_data.count("${")+1):
if "${" in str_data and "}" in str_data:
index=str_data.index("${")
indexend=str_data.index("}",index)
old_value=str_data[index:indexend+1]
#获取对象属性
fun_name=old_value[2:old_value.index("(")]
fun_values=old_value[old_value.index("(")+1:old_value.index(")")]
fun_values_new=fun_values.split(",")
#*fun_values_new 解包 列表
if fun_values_new != " ":
#getattr() 函数用于返回一个对象属性值。
#self.obj为对象名称
new_value=getattr(self.obj,fun_name)(*fun_values_new)
str_data=str_data.replace(old_value,str(new_value))
else:
new_value = getattr(self.obj,fun_name)()
str_data = str_data.replace(old_value, str(new_value))
if isinstance(data,dict) or isinstance(data,list):
data=json.loads(str_data)
else:
data=data_type(str_data)
return data
#yaml文件封装
def send_yaml(self,arges_name):
yaml_key = arges_name.keys()
if "name" in yaml_key and "request" in yaml_key:
yaml_request=arges_name["request"]
request_key = yaml_request.keys()
if "method" in request_key and "url" in request_key:
method=yaml_request.pop("method")
url=yaml_request.pop("url")
res=self.send_request(method,url,**arges_name["request"])
res_text=res.text
#状态码
res_status=res.status_code
res_json=""
try:
res_json = res.json()
except Exception as e:
print("jsonpath数据类型必须是json格式")
if "extract" in yaml_key:
for key,values in arges_name["extract"].items():
if "(.*?)" in values or "(.+?)" in values:
zz_value=re.search(values,res_text)
if zz_value:
write_token_yaml({key:zz_value.group(1)})
else:
jp_values=jsonpath.jsonpath(res_json,values)
if jp_values:
write_token_yaml({key:jp_values[0]})
else:
print("request中缺少关键字段:name,request")
else:
print("yaml文件第一阶段缺少关键字段:name,request")
session=requests.session()
def send_request(self,method,url,**kwargs):
url = self.url + self.read_token(url)
for key,value in kwargs.items():
if key in ["params","json","data","headers"]:
kwargs[key]=self.read_token(value)
elif key == "files":
for file_key,file_value in value.items():
value[file_key] = open(file_value,"rb")
res=Unifiedrequest.session.request(method,url,**kwargs)
print(res.text)
return res
修改点
if "${" in str_data and "}" in str_data:
index=str_data.index("${")
indexend=str_data.index("}",index)
old_value=str_data[index:indexend+1]
#获取对象属性
fun_name=old_value[2:old_value.index("(")]
fun_values=old_value[old_value.index("(")+1:old_value.index(")")]
fun_values_new=fun_values.split(",")
#*fun_values_new 解包 列表
if fun_values_new != " ":
#getattr() 函数用于返回一个对象属性值。
new_value=getattr(self.obj,fun_name)(*fun_values_new)
str_data=str_data.replace(old_value,str(new_value))
else:
new_value = getattr(self.obj,fun_name)()
str_data = str_data.replace(old_value, str(new_value))
# #创建标签
#debug_talk.DebugTalk()是在更目录创建的动态参数类方法
@pytest.mark.parametrize("args_name",read_yaml("./src/weixin_api/post_create_tags.yaml"))
def test_post_tags(self,args_name):
Unifiedrequest("weixin_url",debug_talk.DebugTalk()).send_yaml(args_name)