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

目录

[1. 响应进行断言](#1. 响应进行断言)

[1.1 在yaml用例中写入断言内容](#1.1 在yaml用例中写入断言内容)

[1.2 封装断言方法](#1.2 封装断言方法)

[1.3 在执行流程中加入断言判断内容](#1.3 在执行流程中加入断言判断内容)

[2. 数据库数据断言](#2. 数据库数据断言)

[2.1 在yaml用例中写入断言内容](#2.1 在yaml用例中写入断言内容)

[2.2 连接数据库并封装执行sql的方法](#2.2 连接数据库并封装执行sql的方法)

[2.3 封装后校验方法是否可执行](#2.3 封装后校验方法是否可执行)

[2.4 使用之前封装的断言方法,加入数据库的case](#2.4 使用之前封装的断言方法,加入数据库的case)


1. 响应进行断言

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

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

1.2 封装断言方法

python 复制代码
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 在执行流程中加入断言判断内容

python 复制代码
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用例中写入断言内容

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

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

python 复制代码
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 封装后校验方法是否可执行

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

执行结果

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

python 复制代码
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

结果示例-断言失败

相关推荐
Moonnnn.13 分钟前
51单片机学习——动态数码管显示
笔记·嵌入式硬件·学习·51单片机
黑子哥呢?15 分钟前
安装Bash completion解决tab不能补全问题
开发语言·bash
失败尽常态52319 分钟前
用Python实现Excel数据同步到飞书文档
python·excel·飞书
落笔画忧愁e19 分钟前
FastGPT快速将消息发送至飞书
服务器·数据库·飞书
2501_9044477420 分钟前
OPPO发布新型折叠屏手机 起售价8999
python·智能手机·django·virtualenv·pygame
青龙小码农21 分钟前
yum报错:bash: /usr/bin/yum: /usr/bin/python: 坏的解释器:没有那个文件或目录
开发语言·python·bash·liunx
大数据追光猿26 分钟前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
Σίσυφος190033 分钟前
halcon 条形码、二维码识别、opencv识别
前端·数据库
南宫生1 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode
Leuanghing1 小时前
【Leetcode】11. 盛最多水的容器
python·算法·leetcode