Django+vue自动化测试平台(24)-- 接口自动化之处理变量

  • 众所周知,接口自动化用例最重要的是测试数据,而测试用例本质上依赖各种数据的组合。
  • 做过接口自动化的朋友可以想一下,我们在使用postman或JMeter编写用例脚本的时候,比较费时间的就是接口间参数的传递了。
  • 而通过现有工具实现接口间参数传递,只需要在下游接口中的"变量"设置{{}}或者${}即可,而如何替换的我们似乎并未考虑过。
  • 在我们设计自己的框架时就不得不面对这个问题了。大家都知道http协议接口的请求参数格式大多是json格式,但本文介绍的service服务的参数格式是对象。

参数化如何实现?

python 复制代码
{
  "env_id": 1,
  "test_obj": "{{test_pre}}",
  "test_list": [
    {"test_obj1": "{{code}}"},
    {"test_obj2": "{{message}}"}
    ]
}
这样一段引用{{xxx}}变量的json对象怎么办,如何转化成一下
{
  "env_id": 1,
  "test_obj": "123",
  "test_list": [
    {"test_obj1": "100"},
    {"test_obj2": "登录成功"}
  ]
}


这个是做参数化的关键步骤,废话少说直接看实现:
# def resolve_var(data, env_id):定义了一个名为 resolve_var 的函数,接收要处理的数据 data 和环境标识 env_id。
# 首先获取与环境变量相关的模型对象 env_var 和全局变量相关的模型对象 global_var。
# 定义了空的字典 global_vars 和 local_vars。
# 然后检查数据类型,如果是字典:
# 遍历字典的键值对,对于值是字符串且包含特定模板标记({{ 和 }})的情况,分别在环境变量和全局变量中根据变量名和环境标识进行查找,如果找到对应的值,就用找到的值替换原字符串;如果都没找到,就用原字符串加上"变量未找到"来替换。对于值不是字符串的情况,递归调用自身进行处理。
# 如果是列表:则对列表中的每个元素递归调用进行处理。
# 如果是字符串且包含特定模板标记:
# 通过正则表达式提取出变量名,然后同样在环境变量和全局变量中查找并进行相应替换操作。
def resolve_var(data, env_id):
    env_var = Env_var.objects  # 环境变量表
    global_var = Global_var.objects  # 全局变量表
    global_vars = {}
    local_vars = {}
    if isinstance(data, dict):
        for key, value in data.items():
            if isinstance(value, str):
                if '{{' in value and '}}' in value:
                    env_var_value = env_var.filter(var_name=value, env_id=env_id)
                    global_var_value = global_var.filter(var_name=value)
                    if env_var_value.count() > 0:
                        data[key] = value.replace(value, env_var_value[0].var_value)
                    elif global_var_value.count() > 0:
                        data[key] = value.replace(value, global_var_value[0].var_value)
                    else:
                        data[key] = value.replace(value, value + "变量未找到")

            else:
                resolve_var(value, env_id)
    elif isinstance(data, list):
        for item in data:
            resolve_var(item, env_id)
    elif isinstance(data, str):
        if "{{" in data and "}}" in data:
            key = re.findall(r"\{{(.+?)}}", data)
            for a in range(len(key)):
                v_key = "{{" + key[a] + "}}"
                env_var_value = env_var.filter(var_name=v_key, env_id=env_id)
                global_var_value = global_var.filter(var_name=v_key)
                if env_var_value.count() > 0:
                    data = data.replace(v_key, env_var_value[0].var_value)
                elif global_var_value.count() > 0:
                    data = data.replace(v_key, global_var_value[0].var_value)
                else:
                    data = data.replace(v_key, v_key + "变量未找到")
    return data

通过以上的代码,实现了从变量{{xxx}}到实际值的替换,传入dict,list,str类型的数据都可以,解决了变量的问题。(个人短见,仅供参考)

相关推荐
FRing033 小时前
vue2干货总结7(自定义指令、插槽、单页应用程序、路由的使用(VueRouter))
开发语言·前端·vue.js·vue2
橙橙笔记3 小时前
具身智能的学习 - 完成一个机械臂 第1节
python·学习·机械臂·具身智能
小小张说故事3 小时前
Python 的 class 语句到底执行了什么?拆开 __prepare__、metaclass.__new__ 和那个被讲反的 __set_name__ 顺序
python
天天被压力5 小时前
【A股分钟级高频数据完全手册 #07】北交所历史分钟K线接口:京市Pro版分时批量
java·人工智能·python
天天被压力5 小时前
【A股分钟级高频数据完全手册 #08】股票日、分时数据接口对比:普通分时与Pro版差异实测
java·人工智能·python
特立独行的猫A6 小时前
AI 时代,我为什么推荐用 cj-tauri 开发桌面应用
java·后端·python
小lo想吃棒棒糖6 小时前
把机器人训练从 GPU 搬到昇腾 NPU:启元 Q1 起身动作 PPO 训练全记录
python·机器人·昇腾·启元机器人
Thanks_ks6 小时前
【第 006 讲】搭建 PyCharm 开发环境:PyCharm 的下载与安装 | 初始设置与常用配置
ide·python·pycharm·开发工具·jetbrains·开发环境·集成开发环境
ruanno_top6 小时前
点全选,已选的被清空了:Transfer 三态复选框的三个 bug
vue.js
lisw057 小时前
基于神经网络的机器人导航系统的设计与执行!
神经网络·机器人·自动化