pytest框架之热加载

什么是热加载

热加载:就是在代码运行的过程中动态的调用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)

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值