python自动化关联接口参数化(2)高阶

本文详细介绍了Python自动化测试中如何处理接口返回值,包括使用返回数据的key值保存为临时变量、为key值设置别名、以字典格式精确保存特定key以及条件保存key的方法,旨在提升接口参数化的效率和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、接口数据保存源码

import re
import ast
import jmespath


class BaseModel:

    '''
    返回值参数化保存的全局变量视图
    '''    
    var_map = {}
    
    
class SaveResponseData:
    def save_data(self, save_key_list, raw_data):
        """
        :param save_key_list: 需要保存的数据列表
        :param raw_data: 接口返回的json数据
        :return: None
        """
        if not save_key_list:
            return None
        save_key_list = ast.literal_eval(save_key_list) if isinstance(save_key_list, str) else save_key_list
        for saveKey in save_key_list:
            if isinstance(saveKey, tuple):
                value_list = []
                if '.' in saveKey[0]:
                    key = saveKey[0].replace('"', "'")
                    BaseModel.var_map[saveKey[1]] = jmespath.search(key, raw_data)
                else:
                    self.get_response_key_value(saveKey[0], raw_data, value_list)
                    BaseModel.var_map[saveKey[1]] = value_list
            if isinstance(saveKey, str):
                value_list = []
                self.get_response_key_value(saveKey, raw_data, value_list)
                BaseModel.var_map[saveKey] = value_list
            if isinstance(saveKey, list):
                var_path_list = saveKey[0].split('.')
                var_path = ''
                for var in var_path_list:
                    if re.findall(r'^\d+$', var):
                        var_path += f'[{var}]'
                    else:
                        var_path += f'["{var}"]'
                BaseModel.var_map[saveKey[1]] = [eval('raw_data' + var_path)]
    
    def get_response_key_value(self, save_key, raw_data, value_list):
        """
        遍历返回的json数据获取想要保存的值
        :param save_key: save_key接口返回值中需要保存的key —> str,tuple,list
        :param raw_data: 接口返回的json数据
        :param value_list: 用来保存获得的key对应的value
        :return:
        """
        if isinstance(raw_data, dict):
            for key, value in raw_data.items():
                if key == save_key:
                    if isinstance(value, str):                        
                        value = value.replace(r'\n', '').replace(r'\r', '')
                    value_list.append(value)
                self.get_response_key_value(save_key, value, value_list)
        elif isinstance(raw_data, (list, tuple)):
            for value in raw_data:
                self.get_response_key_value(save_key, value, value_list)

2、接口返回值保存方法

2.1 使用返回数据的key值保存为临时变量

response = {"code":0,
         "message": "操作成功",
         "data": [
             {"id": 1, "name": "大众", "car_info": {"product_id": 123}},
             {"id": 2, "name": "本田", "car_info": {"product_id": 123}},
    		 {"id": 3, "name": "奥迪", "car_info": {"product_id": 123}}
         ]}
 saveKey = ['employee_id', 'employee_name']
 SaveResponseData().save_data(saveKey, response)
 print(BaseModel.var_map)
 # 执行代码保存后var_map临时变量值
 >>> var_map = {'id': [1, 2, 3], 'name': ['大众', '本田', '奥迪']} #使用-->eg-01# 备注:saveKey = [key1, key2, ```keyn] 多个key同时保存

2.2 给保存的key值取别名

 # 场景多个接口返回数据中包含相同的key
 # 接口A返回数据
 response_a = {
     "code": 0,
     "message": "操作成功",
     "data": [{"id": "421", "group_name": "前台1","employee_id": "915","employee_name": "李俊",},
             {"id": "422", "group_name": "前台2","employee_id": "915","employee_name": "李俊",}]} 
 # 接口B返回数据
 response_b = {
     "code": 0,
     "message": "操作成功",
     "data": [{"id": "01", "car_name": "大众"},
             {"id": "02", "car_name": "本田"}]}
 saveKey_a = ['id']
 saveKey_b = ['id']
 SaveResponseData().save_data(saveKey_a, response_a)
 SaveResponseData().save_data(saveKey_b, response_b)
 print(BaseModel.var_map)
>>> var_map = {'id': ['01', '02']}
 # 接口A返回数据
 response_a = {
     "code": 0,
     "message": "操作成功",
     "data": [{"id": "421", "group_name": "前台1","employee_id": "915","employee_name": "李俊",},
             {"id": "422", "group_name": "前台2","employee_id": "915","employee_name": "李俊",}]}
response_b = {
     "code": 0,
     "message": "操作成功",
     "data": [{"id": "01", "car_name": "大众"},
             {"id": "02", "car_name": "本田"}]}
 # 当我们需要保存的值key相同时后面的变量会覆盖前一个变量
 # 此时需要在保存时给变量取别名
 # 接口A保存时 
 saveKey_a = [('id', 'group_id')] # 使用-->eg-02
 SaveResponseData().save_data(saveKey_a, response_a)
 # 接口B保存时
 saveKey_b = [('id', 'car_id')] # 使用-->eg-02
 SaveResponseData().save_data(saveKey_b, response_b)
 # 执行代码保存后var_map临时变量值
 print(BaseModel.var_map) 
 >>> var_map = {'group_id': ['421', '422'], 'car_id': ['01', '02']}

2.3 以字典格式精确保存某个key

 response = {
     "code": 0,
     "message": "操作成功",
     "data": [{"id": "421", "group_name": "前台1","employee_id": "915","employee_name": "李俊",},
             {"id": "422", "group_name": "前台2","employee_id": "915","employee_name": "李俊",}]}
 # 保存data数据结构的第一个id值,取别名group_id(必须)
 saveKey = [['data.0.id', 'group_id']]
 SaveResponseData().save_data(saveKey,  response)
 # 执行代码保存后var_map临时变量值
 print(BaseModel.var_map) 
 >>> var_map = {'group_id': ['421']}

2.4 条件保存某个key

 response = {
     "code": 0,
     "message": "操作成功",
     "data": [{"id": "421", "group_name": "前台1","employee_id": "915","employee_name": "李天一",},
             {"id": "422", "group_name": "前台2","employee_id": "916","employee_name": "李俊",}]}
 # 保存id为421的employee_name
 saveKey = [("data[?id=='421'].employee_name", 'employee_name')]
 SaveResponseData().save_data(saveKey,  response)
 print(BaseModel.var_map) 
 # 执行代码保存后var_map临时变量值
 >>> var_map = {'employee_name': ['李天一']}
"data[?id=='421'].employee_name" # 此处支持jmespath取值,知识扩展:https://blog.youkuaiyun.com/a200822146085/article/details/90044086

下一章:python自动化关联接口参数化(3)高阶

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值