从0开始python学习-46.pytest框架之通过yaml处理接口关联问题-针对变量处理

目录

1. 提取变量

1.1 提取方法

1.2 提取地方:响应的body,响应的cookie,响应头

1.3 提取方式:

1.4 示例:在能获取到对应token的yaml用例中写入

2.使用变量:封装一个通用extract_util.py

3. 调用测试用例,使用变量


1. 提取变量

1.1 提取方法

extract: 
    保存值的变量名: [提取地方,提取方式,提取之后的下标取值]

1.2 提取地方:响应的body,响应的cookie,响应头

print(res.text)            # 返回字符串类型的数据
print(res.content)         # 返回二进制类型的数据
res.json()                 # 把json字符串转化为字典格式返回
print(res.status_code)     # 状态码
print(res.reason)          # 状态信息
print(res.cookies)         # cookie信息
print(res.encoding)        # 编码格式
print(res.headers)         # 响应头
print(res.elapsed)         # 耗时
print(res.request.method)  # 请求方式
print(res.request.url)     # 请求路径
print(res.request.headers) # 请求头
print(res.request.body)    # 请求数据

1.3 提取方式:

正则表达式:re.findall(pattern, string)

jsonpath:jsonpath.jsonpath(obj, expr)

1.4 示例:在能获取到对应token的yaml用例中写入

extract: 
  access_token: [json,"$.access_token",0]
  csrf_token: [text,'name="csrf_token" value="(.*?)"',0]

2.使用变量:封装一个通用extract_util.py

class ExtractUtil:

   # 解析提取变量
    def extract(self,res,var_name,attr_name,expr:str,index):
        # 通过深拷贝,将数据拷贝一份出来,且不影响源数据
        new_res = copy.deepcopy(res)
        # 将json()修改为json属性,用于反射使用,如果无法获取到new_res.json()抛出异常
        try:
            new_res.json = new_res.json()
        except Exception:
            new_res.json = {"msg":'response not json data'}
        # 通过反射获取属性的值
        data = getattr(new_res,attr_name)
        # 判断使用的是什么提取方式
        if expr.startswith('$'):
            # json提取方式
            list = jsonpath.jsonpath(dict(data),expr)
        else:
            # 正则提取方式
            list = re.findall(expr,data)
        # 通过下标进行取值,并写入extract.yaml文件中
        if list: # 当list不为空,即提取到了数据
            writer_yaml({var_name:list[index]})

    # 解析使用变量,把${access_token}替换从extract.yaml里面提取的具体的值
    def use_extract_value(self,request_data: dict):
        # 1.把字典转为字符串,因为使用替换的方法Template()里面的只能是string
        data_str = yaml.safe_dump(request_data)
        # 2.字符串替换,将extract.yaml中的所有获取到的数据,替换到需要使用${access_token}的yaml文件
        new_request_data = Template(data_str).safe_substitute(read_all())
        # 3.把字符串还原成字典,因为最后接收的还是dict,所以需要还原回去
        data_dict = yaml.safe_load(new_request_data)
        return data_dict

3. 调用测试用例,使用变量

1. extract()方法为通过接口的响应提取需要的变量,如token,所以是在请求之后执行

2. use_extract_value()方法为使用提取到的变量进行入参使用,所以是在请求之前执行

3. 一定要注意用例的执行顺序,不然这里可能就无法正确提取使用

def create_testcase(yaml_path):
    @pytest.mark.parametrize('caseinfo', read_testcase(yaml_path))
    def func(self,caseinfo):
        # 读取yaml文件中的请求四要素
        new_caseinfo = verify_yaml(caseinfo)
        # 使用提取的值
        new_request = eu.use_extract_value(new_caseinfo.request)
        # 发送请求
        res = RequestUtil().send_request(**new_request)
        # 在请求之后得到的响应去提取需要的变量
        if new_caseinfo.extract: # extract存在的情况,则将值获取
            for key,value in new_caseinfo.extract.items():
                eu.extract(res,key,*value)

    return func

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/304514.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式之过滤器模式

目录 1.简介 2.过滤器的实现 2.1.过滤器的角色 2.2.类图 2.3.具体实现 3.过滤器模式的优点 4.过滤器模式的不足 5.适用的场景 1.简介 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种结构型设计模式&…

5.5 THREAD GRANULARITY

性能调优中一个重要的算法决定是线程的粒度。有时,在每个线程中投入更多工作并使用更少的线程是有利的。当线程之间存在一些冗余工作时,就会产生这种优势。在当前一代设备中,每个SM的指令处理带宽有限。每个指令都消耗指令处理带宽&#xff0…

迎接人工智能的下一个时代:ChatGPT的技术实现原理、行业实践以及商业变现途径

课程背景 2023年,以ChatGPT为代表的接近人类水平的对话机器人,AIGC不断刷爆网络,其强大的内容生成能力给人们带来了巨大的震撼。学术界和产业界也都形成共识:AIGC绝非昙花一现,其底层技术和产业生态已经形成了新的格局…

【数据结构 | 二叉树入门】

数据结构 | 二叉树入门 二叉树概念:二叉树特点:二叉树的基本形态特殊二叉树满二叉树完全二叉树 二叉树的存储结构二叉树的遍历先序遍历中序遍历后序遍历 计算二叉树的节点个数计算叶子节点的个数树的高度求第k层节点个数 二叉树概念: 如下图…

【51单片机】延时函数delay的坑——关于无符号整型数据for语句“x >= 0“变成死循环

请认真看看以下延时函数是否正确,并且指出错误:(考考C语言功底) void delay_ms(unsigned int xms) //delay x ms {unsigned int x,y;for(xxms;x>0;x--)for(y124;y>0;y--); }废话少说,上正确代码: v…

python进阶 -- 日志装饰器详解

日志 日志:记录程序运行的时候,出现的问题,或者说验证流程是否正常 在实际工作中,python的脚本命令一般是放在服务器执行的linux系统 日志其实就是记录程序运行时出现的问题、或者正常的打印,协助出现问题的时解决排查…

以太网交换机——稳定安全,构筑数据之桥

交换机,起源于集线器和网桥等网络通信设备,它在性能和功能上有了很大的发展,因此逐渐成为搭建网络环境的常用的设备。 随着ChatGPT爆发,因为用户量激增而宕机事件频频发生,云计算应用催生超大规模算力需求,…

kubernetes Namespace Labels 详解

写在前面:如有问题,以你为准, 目前24年应届生,各位大佬轻喷,部分资料与图片来自网络 内容较长,页面右上角目录方便跳转 namespace 实现资源分组,label实现业务分组 Namespace 基础理论 最重…

Spring AOP(详解)

目录 1.AOP概述 2.AOP相关术语 3.Spring AOP的原理机制 3.1JDK动态代理 3.2 CGLIB动态代理 3.3简单代码展示 3.3.1JDK动态代理 3.3.2CGLIB动态代理 4.Spring的AOP配置 4.1pom.xml 4.2增强方法 4.3切点 4.4切面 5.基于注解的AOP配置 5.1.创建工程 5.2.增强 5.3AOP…

使用flet创建todo应用

使用 Flet 在 Python 中创建待办事项应用 Create To-Do app in Python with Flet 翻译官网教程https://flet.dev/docs/tutorials/python-todo,对一些地方进行了注释和修改。 安装flet Python版本需要3.8及以上,使用pip安装: pip install…

YY9706.102-2021 医疗设备EMC检测知识-RE

一:RE(辐射发射试验) 按照GB 4824 6.2.2电磁辐射骚扰限值描述,在相对应的实验室和距离测量时,选择不同的限值进行测量。 以上只列出了1组的A、B类限值,2组设备的限值在6.3章节有介绍,对于我们的…

Backtrader 文档学习-Strategy(下)

Backtrader 文档学习-Strategy(下) 1. notify_cashvalue # 测试 #notify_cashvalue 方法特点 class Test_Strategy(bt.Strategy): # 策略通用初始参数params ((maperiod1, 5),(maperiod2, 20),(printlog, True), # 写入日志标志(logfilename, Test_…

Vue-8、Vue事件处理

1、点击事件 <!DOCTYPE html> <html lang"en" xmlns:v-model"http://www.w3.org/1999/xhtml" xmlns:v-bind"http://www.w3.org/1999/xhtml"xmlns:v-on"http://www.w3.org/1999/xhtml"> <head><meta charset&quo…

计算机网络—— 概述

概述 1.1 因特网概述 网络、互联网和因特网 网络由若干结点和连接这些结点的链路组成多个网络还可以通过路由器互联起来&#xff0c;这样就构成了一个覆盖范围更大的网络&#xff0c;即互联网&#xff08;或互连网&#xff09;。因特网&#xff08;Internet&#xff09;是世…

react输入框检索树形(tree)结构

input搜索框搜索树形子级内容1. input框输入搜索内容2. 获取tree结构数据3. 与tree匹配输入的内容&#xff0c;tree是多维数组&#xff0c;一级一级的对比输入的内容是否匹配&#xff0c;用forEach循环遍历数据&#xff0c;匹配不到在往下找&#xff0c;直到找到为null &#x…

求求你,别再乱用@Transactional了

求求你&#xff0c;别再乱用Transactional了 文章目录 &#x1f50a;先看个问题&#x1f4d5;情况1情况1结果 &#x1f5a5;️情况2情况2结果 &#x1f4dc; 情况三情况3结果 &#x1f4d8;情况4情况4结果 &#x1f516;先说结论情况1结果情况2结果情况3结果情况4结果&#x1f…

oracle 12c pdb expdp/impdp 数据导入导出

环境 (源)rac 环境 byoradbrac 系统版本&#xff1a;Red Hat Enterprise Linux Server release 6.5 软件版本&#xff1a;Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit byoradb1&#xff1a;172.17.38.44 byoradb2&#xff1a;172.17.38.45 (目的&am…

2024年中职网络安全——Windows操作系统渗透测试(Server2105)

Windows操作系统渗透测试 任务环境说明&#xff1a; 服务器场景&#xff1a;Server2105服务器场景操作系统&#xff1a;Windows&#xff08;版本不详&#xff09;&#xff08;封闭靶机&#xff09;需要环境加Q 目录 1.通过本地PC中渗透测试平台Kali对服务器场景进行系统服务…

区块链金融科技:技术融合与挑战应对【文末送书-16】

文章目录 前言一.区块链与金融科技的融合&#xff1a;革新金融格局的技术之光1.1区块链技术简介1.2 区块链在金融科技中的应用 二.智能合约2.1 去中心化金融&#xff08;DeFi&#xff09;2.2区块链对金融科技的影响2.3数据安全性 三.区块链与金融科技【文末送书-16】3.1 粉丝福…

spring Security源码讲解-Sevlet过滤器调用springSecurty过滤器的流程

承接上文 上一节 http://t.csdnimg.cn/ueSAl 最后讲到了过滤器收集完成注入容器&#xff0c;这节我们来讲Security的Filter是怎么被Spring调用的。 我们先看webSecurity的performBuild方法(), ![在这里插入图片描述](https://img-b 也就是说&#xff0c;最终返回的过滤器对象…