八、YAML文件中动态解析变量引用(热加载单接口多用例场景apiutils_single.py)

实现功能:
执行接口测试用例的工具类 RequestsBase,它支持动态解析和替换 YAML 文件中的变量引用,并能够处理接口返回值的提取和断言。
1、函数设计
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、测试用例
    单接口用例

3、代码

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

"""
获取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 @ 2025-02-25 14:14  测试三思  阅读(105)  评论(0)    收藏  举报