九、YAML文件中动态解析变量引用(热加载业务场景多接口apiutils_business.py)

RequestsBase

  • init 方法:

    • 初始化 ConfigParse、SendRequests 和 Assertions 实例。
    • 用于读取配置文件、发送请求和执行断言。
  • parse_and_replace_variables 方法:

    • 解析并替换 YAML 数据中的变量引用,如 ${get_extract_data(token)}。
    • 支持嵌套数据、单个键值数据和列表数据。
    • 使用正则表达式提取变量名和参数,通过 getattr 调用 DebugTalk 类中的方法。
    • 使用正则表达式替换原始字符串中的变量引用为实际值。
  • execute_testcase 方法:

    • 执行测试用例。
    • 解析 baseInfo 和 testCase 信息。
    • 调用 SendRequests 发起请求。
    • 将返回的数据转换为 JSON 格式。
    • 将登录接口的返回值(如 token)写入 extract.yaml 文件。
    • 执行结果断言。
  • extract_data 方法:

    • 提取单个参数,支持 JSON 提取器。
    • 使用 jsonpath 从响应中提取指定路径的值。
    • 将提取的值写入 extract.yaml 文件。
  • extract_data_list 方法:

    • 提取多个参数,支持 JSON 提取器。
    • 使用 jsonpath 从响应中提取指定路径的值。
    • 将提取的值写入 extract.yaml 文件。

2、代码

点击查看代码
# 测试用例文件动态解析(热加载)
# 热加载:动态获取接口的返回值或者函数值,作为其它接口的入参数

"""
获取extract全局变量文件中的动态数据
例如extract.yaml文件格式
# 1、键值队嵌套的数据
Cookie:
 access_token_cookie: eyJhbGciOiJIUZI1NiISInR5CCI6IkpXVcJ9.eyImcmVzaCI6ZmFsc2USImLhdCI6MTCWNTE5ODAWNSWianRDIiOIZTYINZN

2、单个键值数据
token: B9AD781F4DAD1DAEfabEfC3EeB1EF
userId:'2823362215735222084

3、列表中的数据
goodsId:
- 183827888191
- 172817212121
- 12981982122
- 23123123123
"""
import re
import random
from unit_tools.handle_data.yaml_handler import get_extract_yaml
from datetime import date


class DebugTalk:

    def get_extract_data(self, node_name, out_format=None):
        """
        获取extract.yaml数据,1、嵌套取值 2、单个取值 3、列表取值
        首先判断out_format是否为数字类型,如果是就是列表取值,如果不是就是获取下一个节点的value
        :param node_name: extract.yaml文件中的key
        :param out_format: str类型,0:随机取读取;-1:读取全部数据,返回字符串格式;-2:读取全部数据,返回是列表格式;其它值就是顺序读取
        :return:
        """
        data = get_extract_yaml(node_name)
        if out_format is not None and bool(re.compile(r'^[+-]?\d+$').match(str(out_format))):
            out_format = int(out_format)
            data_value = {
                out_format: self.seq_read(data, out_format),
                0: random.choice(data),
                -1: ','.join(data),
                -2: ','.join(data).split(',')
            }
            data = data_value[out_format]
        else:
            data = get_extract_yaml(node_name, out_format)
        return data

    def seq_read(self, data, randoms):
        """获取extract.yaml,第二个参数不为0,-1,-2的情况下"""
        if randoms not in [0. - 1. - 2]:
            return data[randoms - 1]
        else:
            return None

    # 获取系统当前日期,不带时分秒
    def get_now_time(self):
        return date.today()

    # 获取请求头header

    def get_headers(self, params_type):
        """
        根据参数params_type,返或header格式:表单还是json
        :param params_type:
        :return:
        """
        headers_mapping = {
            'data': {'Content-Type': 'application/x-www-formurlencoded;charset=UTF-8'},
            'json': {'Content-Type': 'application/json;charset=UTF-8'}
        }

        header = headers_mapping.get(params_type)
        if header is None:
            print('不支持的请求格式,只支持表单和json格式')
        return header


if __name__ == '__main__':
    debug = DebugTalk()
    # 获取嵌套数据
    res = debug.get_extract_data('Cookie', 'access_token_cookie')
    # 获取列表数据
    # res = debug.get_extract_data('goodsId','0')
    # 获取单个键值
    # res = debug.get_extract_data('token')

    print(res)

posted @   测试三思  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示