实战问题总结 | Python比对接口返回数据和数据库所存数据是否一致

接到的测试任务为,对外联调的查询接口优化,由之前的查库改为查缓存数据,需要比对接口返回的字段值与数据库是否一致,涉及字段70个

脚本思路如下:

1、封装获取接口返参的方法

def get_text(res, key):
    """
    获取接口指定字段的返回值
    :param res: 请求结果
    :param key: 需获取的字段名
    :return: key的value
    """
    if res is not None:
        try:
            txt = json.loads(res)
            value = jsonpath.jsonpath(txt, '$..{}'.format(key))
            # jsonpath获取成功会返回list,获取失败会返回False
            if value:
                if len(value) == 1:
                    return value[0]
            return value
        except Exception as e:
            return e
    else:
        return None

2、封装获取数据库查询结果的方法

'''
数据库新增、查询封装
'''

import pymysql,traceback,sys

class MysqlUtil:
    def __init__(self):
        '''
        初始化方法,链接数据库
        '''
        self.host = 'XXX'  # 主机名
        self.user = 'XXX'  # 数据库用户名
        self.password = 'XXX'  # 数据库密码
        self.port = 3306  # 数据库端口
        self.charset = 'utf8'

    def insert(self,database,sql):
        '''
        插入数据库
        :param sql: 插入数据库的SQL语句
        :param database: 数据库名称
        :return:
        '''
        self.database = database
        self.db = pymysql.connect(
            host = self.host,user=self.user,password=self.password,db=self.database,
                            port=self.port,charset=self.charset)        #建立链接
        self.cursor = self.db.cursor(
            cursor=pymysql.cursors.DictCursor)                      #设置游标,并将游标设置为字典类型

        try:
            #执行SQL语句
            self.cursor.execute(sql)
            #提交到数据库执行
            self.db.commit()
        except Exception:               #方法一:捕获所有异常
            #如果发生异常,则回滚
            print('发生异常',Exception)
            self.db.rollback()
        finally:
            #最终关闭数据库连接
            self.db.close()

    def fetchone(self,database,sql):
        '''
        查询数据库,单个结果集
        fetchone()          该方法获取下一个查询结果集,结果集是一个对象
        '''
        self.database = database        #数据库名称
        self.db = pymysql.connect(
            host = self.host,user=self.user,password=self.password,db=self.database,
                            port=self.port,charset=self.charset)        #建立链接
        self.cursor = self.db.cursor(
            cursor=pymysql.cursors.DictCursor)                      #设置游标,并将游标设置为字典类型

        try:
            #执行SQL语句
            self.cursor.execute(sql)
            resulist = self.cursor.fetchone()                  #获取查询的结果
            return resulist
        except Exception:           #方法二: 采用traceback模块查看异常
            #输出异常信息
            traceback.print_exc()
            #如果发生异常,则回滚
            self.db.rollback()
        finally:
            #最终关闭数据库连接
            self.db.close()


    def fetchall(self,database,sql):
        '''
            查询数据库,多个结果集
            fetchall():接收全部的返回结果行
        '''
        self.database = database        #数据库名称
        self.db = pymysql.connect(
            host = self.host,user=self.user,password=self.password,db=self.database,
                            port=self.port,charset=self.charset)        #建立链接
        self.cursor = self.db.cursor(
            cursor=pymysql.cursors.DictCursor)                      #设置游标,并将游标设置为字典类型

        try:
            # 执行SQL语句
            self.cursor.execute(sql)
            resulit = self.cursor.fetchall()
            return resulit                #获取查询的结果
        except Exception:               #方法一:捕获所有异常
            #如果发生异常,则回滚
            print('发生异常',Exception)
            self.db.rollback()
        finally:
            # 最终关闭数据库连接
            self.db.close()

    def delect(self,database,sql):
        '''
            删除结果集
            :param database: 数据库名称
            :param sql: sql语句
            :return:
        '''
        self.database = database        #数据库名称
        self.db = pymysql.connect(
            host = self.host,user=self.user,password=self.password,db=self.database,
                            port=self.port,charset=self.charset)        #建立链接
        self.cursor = self.db.cursor(
            cursor=pymysql.cursors.DictCursor)                      #设置游标,并将游标设置为字典类型

        # 执行SQL语句
        try:
            self.cursor.execute(sql)
            self.db.commit()
        except Exception:  # 方法一:捕获所有异常
            # 如果发生异常,则回滚
            print('发生异常', Exception)
            self.db.rollback()
        finally:
            # 最终关闭数据库连接
            self.db.close()

    def update(self,database,sql):
        '''
            更新结果集
        '''
        self.database = database        #数据库名称
        self.db = pymysql.connect(
            host = self.host,user=self.user,password=self.password,db=self.database,
                            port=self.port,charset=self.charset)        #建立链接
        self.cursor = self.db.cursor(
            cursor=pymysql.cursors.DictCursor)                      #设置游标,并将游标设置为字典类型

        # 执行SQL语句
        try:
            self.cursor.execute(sql)
            self.db.commit()
        except Exception:  # 方法一:捕获所有异常
            # 如果发生异常,则回滚
            print('发生异常', Exception)
            self.db.rollback()
        finally:
            # 最终关闭数据库连接
            self.db.close()

3、数据库返回结果数据类型和接口返回数据类型不一致,需将数据类型属性转换成一致才可比对

举例SQL查询结果为:sort_datebase,接口提取参数返回结果为:response

①获取数据类型属性方法:

 for column in sort_datebase:
        print(column,sort_datebase.get(column),type(sort_datebase.get(column)) )

②转换数据类型方法:

    for column in sort_datebase:
        if type(sort_datebase.get(column)) == datetime.datetime:
            sort_datebase[column] = str(sort_datebase.get(column))  #将查询结果的数据类型转换为str
        elif type(sort_datebase.get(column)) == decimal.Decimal:
            sort_datebase[column] = float(sort_datebase.get(column))
        elif type(sort_datebase.get(column)) == 'NoneType':
            sort_datebase[column] = ' '
        elif type(sort_datebase.get(column)) == int:
            sort_datebase[column] = str(sort_datebase[column])

4、将key名转换一致,数据库字段名与接口返回的字段名不一致,需替换

def str2Hump(text):
    """
    下划线转驼峰
    """
    arr = filter(None, text.lower().split('_'))
    res = ''
    j = 0
    for i in arr:
        if j == 0:
            res = i
        else:
            res = res + i[0].upper() + i[1:]
        j += 1
    return res

5、字典key排序(不一定需要排序,此处是为了直观查看print的结果)

def dict_order(dict_name):  #字典排序
    sort_dict = sorted(dict_name.items())  
    dict_value = {}
    for dict in sort_dict:
        key = dict[0]
        value = dict[1]
        dict_value[key] = value
    return dict_value

6、字典元素比较方法

def compare(dict_file, dict_db):
    for k, v in dict_file.items():
        if v == None:
            v == ''
        elif v != dict_db[k]:
            print(k,'接口返回为',v, '数据库为',dict_db[k])

  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是丸子丫

大佬们来个1毛钱以资鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值