从0开始python学习-48.pytest框架之断言

目录

1. 响应进行断言

1.1 在yaml用例中写入断言内容

1.2 封装断言方法

1.3 在执行流程中加入断言判断内容

2. 数据库数据断言

2.1 在yaml用例中写入断言内容

2.2 连接数据库并封装执行sql的方法

2.3 封装后校验方法是否可执行

2.4 使用之前封装的断言方法,加入数据库的case


1. 响应进行断言

1.1 在yaml用例中写入断言内容

validate:
  equals: # 相等断言
    断言状态码为200: [200,status_code] # [预期结果,实际结果]
  contains: # 包含断言
    断言响应结果包含access_token: [access_token,json]

1.2 封装断言方法

class AssertUtil:
    def assert_all_case(self,res,assert_type,value):
    # 深拷贝响应结果res
    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'}
    # 循环判断断言
    for msg,data in value.items(): # 这里的value值就是断言的value值
        yq,sj = data[0],data[1] # 将预期值和实际值取出来
        # 过反射获取属性的值
        try:
            sj_value = getattr(new_res,sj) # 将获取到的响应结果反射给sj
        except Exception:
            sj_value = sj
        # 判断断言
        match assert_type:
            case "equals":
                assert yq == sj_value,msg
            case "contains":
                assert yq in sj_value,msg

1.3 在执行流程中加入断言判断内容

def stand_case_flow(caseinfo):
    # 读取yaml文件中的数据
    case_obj = verify_yaml(caseinfo)
    # 请求之后得到响应后判断是否需要断言,如果validate不为None,则需要断言
    if case_obj.validate: # 这里可以将yaml中的validate内容取出来
        for assert_type,value in ExtractUtil().use_extract_value(case_obj.validate).items():
          AssertUtil().assert_all_case(res,assert_type,value)
    else:
        print("该用例没有涉及断言内容")

结果示例-断言失败

结果示例-断言成功

 

2. 数据库数据断言

2.1 在yaml用例中写入断言内容

validate:
  db_contains: # 数据库包含断言
    断言返回结果包含sql查询结果: ["SELECT email FROM pw_user WHERE uid = 1",text]

2.2 连接数据库并封装执行sql的方法

class AssertUtil:
    # 连接数据库
    def conn_mysql(self):
        self.conn = pymysql.connect(
            user="user",
            password="pwd",
            host="127.0.0.1",
            database="sd",
            port=3306
        )
        return self.conn

    # 执行sql语句
    def execute_sql(self,sql):
        # 创建数据库链接
        conn = self.conn_mysql()
        # 创建游标
        cs = conn.cursor()
        # 执行SQL
        cs.execute(sql)
        # 取值
        value = cs.fetchone()
        # 关闭资源
        cs.close()
        conn.close()
        # 返回值
        return value

2.3 封装后校验方法是否可执行

if __name__ == "__main__":
    a = AssertUtil().execute_sql("SELECT email FROM pw_user WHERE uid = 1")
    print(a)
    print(type(a))

执行结果

2.4 使用之前封装的断言方法,加入数据库的case

def assert_all_case(self,res,assert_type,value):
    # 深拷贝响应结果res
    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'}
    # 循环判断断言
    for msg,data in value.items():
        yq,sj = data[0],data[1] # 将预期值和实际值取出来
        # 过反射获取属性的值
        try:
            sj_value = getattr(new_res,sj)
        except Exception:
            sj_value = sj
        # 判断断言
        match assert_type:
            case "equals":
                assert yq == sj_value,msg
            case "contains":
                assert yq in sj_value,msg
            case "db_contains":
                yq_value = self.execute_sql(yq)  # 将预期值的sql写入执行sql的方法中,获取结果
                assert yq_value[0] in sj_value, msg  # 注意这里的yq_value获取到的是tuple,需要通过下标取值str

结果示例-断言失败

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

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

相关文章

austin-admin 消息推送平台前端项目依赖低代码平台Amis 怎么使用

austin-admin 消息推送平台前端项目🔥依赖低代码平台Amis 怎么使用 收到一个通知,要将部署一个开源的消息系统 :austin的前端开源:https://gitee.com/zhongfucheng/austin-admin 本地运行 1、使用npm或者yarn这些咯 yarn yarn start2、使用…

【LabVIEW FPGA入门】FPGA中的数学运算

数值控件选板上的大部分数学函数都支持整数或定点数据类型,但是需要请注意,避免使用乘法、除法、倒数、平方根等函数,此类函数比较占用FPGA资源,且如果使用的是定点数据或单精度浮点数据仅适用于FPGA终端。 1.整数运算 支持的数…

pyechart基础

pyecharts - A Python Echarts Plotting Library built with love. 全局配置项 初识全局配置组件 Note: 配置项章节应该配合图表类型章节中的 example 阅读。 全局配置项可通过 set_global_opts 方法设置 InitOpts:初始化配置项 class pyecharts.options.InitO…

Java顺序表(2)

🐵本篇文章将对ArrayList类进行讲解 一、ArrayList类介绍 上篇文章我们对顺序表的增删查改等方法进行了模拟实现,实际上Java提供了ArrayList类,而在这个类中就包含了顺序表的一系列方法,这样在用顺序表解决问题时就不用每次都去实…

【C++干货铺】红黑树 (Red Black Tree)

个人主页点击直达:小白不是程序媛 C系列专栏:C干货铺 代码仓库:Gitee 目录 前言 红黑树的概念 红黑树的性质 红黑树结点的定义 红黑树的插入操作 插入新的结点 检查规则进行改色 情况一 情况二 情况三 插入完整代码 红黑树的验…

SpringMVC参数接收见解4

# 4.参数接收Springmvc中,接收页面提交的数据是通过方法形参来接收: 处理器适配器调用springmvc使用反射将前端提交的参数传递给controller方法的形参 springmvc接收的参数都是String类型,所以spirngmvc提供了很多converter(转换…

【数据结构】归并排序的两种实现方式与计数排序

前言:在前面我们讲了各种常见的排序,今天我们就来对排序部分收个尾,再来对归并排序通过递归和非递归的方法进行实现,与对计数排序进行简单的学习。 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏…

Android Matrix绘制PaintDrawable设置BitmapShader,手指触点为圆心scale放大原图,Kotlin

Android Matrix绘制PaintDrawable设置BitmapShader,手指触点为圆心scale放大原图,Kotlin 在 Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图的圆切图,Kotlin(4)-CSDN博客 的…

2001-2022年上市公司企业财务绩效、公司价值、并购绩效数据(ROA、ROE、TOBINQ变化)

2001-2022年上市公司企业财务绩效、公司价值、并购绩效数据(ROA、ROE、TOBINQ变化) 1、时间:2001-2022年 2、指标:证券代码、统计截止日期、证券简称、行业代码、行业名称、年份、、总资产净利润率B、净资产收益率(ROE)B、托宾Q…

【方法】如何压缩zip格式文件?

zip是一种常见的压缩文件格式,能够高效打包文件便于存储和传输,那zip格式的压缩文件要如何压缩呢? 压缩zip文件需要用到解压缩软件,比如常见的WinRAR、7-Zip软件都可以压缩zip格式。下面一起来看看具体如何操作。 一、使用WinRAR…

日期处理第一篇--优雅好用的Java日期工具类Joda-Time

日常开发中,处理时间和日期是很常见的需求。基础的java内置工具类只有Date和Calendar,但是这些工具类的api使用并不是很方便和强大,于是就诞生了Joda-Time这个专门处理日期时间的库。 简介 Joda-Time提供了Java日期处理的优雅的替代品&…

IntelliJ IDEA 拉取gitlab项目

一、准备好Gitlab服务器及项目 http://192.168.31.104/root/com.saas.swaggerdemogit 二、打开 IntelliJ IDEA安装插件 打开GitLab上的项目,输入项目地址 http://192.168.31.104/root/com.saas.swaggerdemogit 弹出输入登录用户名密码,完成。 操作Comm…

【昕宝爸爸小模块】图文源码详解什么是线程池、线程池的底层到底是如何实现的

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你👍点赞、🗂️收藏、加❤️关注哦。 本文章CSDN首发,欢迎转载,要注明出处哦! 先感谢优秀的你能认真的看完本文&…

发送HTTP POST请求并处理响应

发送HTTP POST请求并处理响应是Web开发中的常见任务。在Go语言中,可以使用net/http包来发送HTTP POST请求并处理响应。 以下是一个示例代码,演示了如何发送HTTP POST请求并处理响应: go复制代码 package main import ( "b…

代码随想录算法训练营day10|232.用栈实现队列、225.用队列实现栈

理论基础 232.用栈实现队列 225. 用队列实现栈 理论基础 了解一下 栈与队列的内部实现机智,文中是以C为例讲解的。 文章讲解:代码随想录 232.用栈实现队列 大家可以先看视频,了解一下模拟的过程,然后写代码会轻松很多。 题目链…

Maven 依赖传递和冲突、继承和聚合

一、依赖传递和冲突 1.1 Maven 依赖传递特性 1.1.1 概念 假如有三个 Maven 项目 A、B 和 C,其中项目 A 依赖 B,项目 B 依赖 C。那么我们可以说 A 依赖 C。也就是说,依赖的关系为:A—>B—>C, 那么我们执行项目 …

性能优化-一文宏观理解OpenCL

本文主要对OpenCL做一个整体的介绍、包括环境搭建、第一个OpenCL程序、架构、优化策略,希望对读者有所收获。 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:高性能(HPC)开发基础…

利用 ChatGPT 高效搜索:举一反三的思考方式,高效查找解决方案

文章目录 基础思路举一反三Go 语言 Web 框架延伸思考思考结论 本文只是我的一些尝试,基于 ChatGPT 实现系统化快速搜索某编程语言的特定领域相关包或者基于其他语言类推荐落地方案的尝试。 这篇文章中描述的方式不一定是好方式,但应该会有一定的启示作用…

Autosar --- CRC8 SAE J1850 CRC计算

前言 CRC计算一般用于通信中,用来保证一组数据的完整性。 发送方发送一组数据dataACRC检验码CRCa(CRC校验码由数据算出); 接收方接收到数据dataACRC校验码CRCa,接收方通过与发送方约定好的计算公式,计算出一…

*p++和(*p)++一样吗

大家好,今天给大家介绍*p和(*p)的区别,文章末尾附有分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!可进群免费领取。 *p 和 (*p) 在 C/C 语言中具有不同的含义。 *p:这个表…