python解析yaml文件动态化参数设计

一、python动态解析.yaml文件参数:

1.1、创建.yaml文件参数:

创建test_case.yaml文件

- name: ${name}
  request:
    url: 'http://www.baidu.com/'
    headers:
      content-type: ${value}
    params:
      username: ${user}
      password: ${pwd}
  assert:
    expect: none
    real: none

1.2、yaml文件读取:

python解析.yaml用例

def read_testcase_yaml(path: str):
    with open(DATAS_YAML_PATH + path, mode='r', encoding='utf-8') as f:
        return yaml.load(f, Loader=yaml.FullLoader)

1.3、校验yaml文件用例参数格式:

校验test_case.yaml文件用例编写格式,是否符合预期,用第一层及第二层参数断言验证

def check_info_yaml(case_info):
    # 获取列表所有的key
    # case_info = case_info[0]
    case_info_keys = case_info.keys()
    # 首先判断caseInfo中是否包含必填的字段
    if 'name' in case_info_keys and 'request' in case_info_keys:
        # 获取request中所有的key
        request_keys = case_info['request'].keys()
        # 判断request中是否包含url、headers、params
        if 'url' in request_keys and 'headers' in request_keys and 'params' in request_keys:
            print("yaml用例标准化格式:校验通过")
        else:
            print("二级关键词必须包含:url,headers,params")
    else:
        print("一级关键词必须包含:name,request,assert")

1.4、动态参数化用例做替换:

这里是主要用框架内部环境变量去做映射,达到替换环境变量的目的
不懂如何设置环境变量的可以参照:https://editor.csdn.net/md/?articleId=124766449

def replace_value(data, *args, **kwargs):
    # 判断data是否存在
    # print(f"参数data为:{data}")
    if data is not None:
        # 判断data类型是列表及字典类型则用json方法转为字符串类型
        # print("进入到判断中")
        if isinstance(data, list) or isinstance(data, dict):
            # print("进入到字典或列表")
            str_data = json.dumps(data, ensure_ascii=False)
        # 判断data非字典及列表则强转为字符串即可
        else:
            # print("进入到其它类型")
            str_data = str(data)
        # print(f"当前参数:{str_data}")
        # 对字符串str_data进行循环,判断是否存在${},存在则替换所有参数
        for rv in range(1, str_data.count("$") + 1):  # 这里判断替换次数
            length = len(str_data)
            # print(f"当前长度为:{length}")
            # print(f"{str_data.count('$')}")
            start_index = str_data.index('${')
            # print(f"当前起始值为:{start_index}")
            end_index = str_data.index('}', start_index, length + 1)
            # print(start_index, end_index)
            # print(f"当前需要替换值:{str_data[start_index:end_index + 1:]}")
            replace_data = read_environment(f'{str_data[start_index + 2:end_index:]}')
            if replace_data is not None:
                str_data = str_data.replace(str_data[start_index:end_index + 1:], str(replace_data))
            else:
                print(
                    f"您要读取替换的key值:{str_data[start_index + 2:end_index:]},不存在")
            rv += 1
        return eval(str_data)

    else:
        print(f"您输入参数有误要替换的参数项为:{data}")


1.5、查看效果:

4个.yaml文件当中的参数均呗替换成功
在这里插入图片描述

1.6、自动化批量执行用例:

参数预制:

    def setup_params(self, **var):
        '''
        如果有自定义传参则进行替换,没有传参则默认随机变量
        :param var:
        :return:
        '''
        for keys in var.keys():
            self.list.append(keys)
        if 'mobile' in self.list:
            mobile = var['mobile']
        else:
            mobile = Ran().ran_mobile()
        add_environment('mobile', mobile)
    def get(self, params):
        '''
        返回请求参数的url、headers、params
        :param params:
        :return:
        '''
        url = params['request']['url']
        headers = params['request']['headers']
        data = params['request']['params']
        return [url, headers, data]
def case(self, islast='true', **var):
    a = read_case_yaml('test_cases.yaml')
        length = len(a)
        if islast == 'true':
            number = length
        else:
            number = length - 4
        host = read_environment('env_datas')['host']
        for i in range(0, number):
            a1 = a[i]
            check_info_yaml(a1)
            name = a1['name']
            with allure.step(f"{name}"):
                if name == '拉取注册协议':
                    self.setup_params(**var)
                a2 = replace_value(a1)
                print(f"替换前的值为:{a1}")
                print(f"替换后的值为:{a2}")
                if name == '注册短信OTP验证':
                    self.get(a2)[2]['bizContent']['agreementList'] = eval(
                        self.get(a2)[2]['bizContent']['agreementList'])
                    print(f"********当前的openId为:{read_environment('openId')}")
                    sql = kcms_sql(openId=read_environment('openId'), number=read_environment('personal')).insert_kums
                    Mysql('xw').inserDB(sql=sql)
                if name == '签署个人协议' or name == '签署税银授信协议':
                    self.get(a2)[2]['bizContent']['templateList'] = eval(self.get(a2)[2]['bizContent']['templateList'])
                if name == '查询授信额度':
                    time.sleep(1)
                res = RunMethod().post(url=host + self.get(a2)[0], headers=self.get(a2)[1], json=self.get(a2)[2])
  • 2
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勒布朗-孟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值