Python接口自动化测试框架(实战篇)-- 数据库操作MySQL

文章目录

    • 一、前言
    • 二、数据库
      • 什么是数据验证
      • 为什么需要操作数据库做数据验证?
      • 现在回到怎样做数据验证的问题上来
    • 三、[PyMSQL](https://pypi.org/project/pymssql/)
      • pymysql如何操作数据库
      • 实际应用
    • 四、总结

一、前言

说起数据库的操作,咱们应该保持一颗敬畏的心,在很多时候,错误不一定是程序引起的,有可能是非法操作了数据库导致的,不到必要一般不建议直接去操作数据库,因为一旦操作错了,结果是不可逆的。那么先说说什么理由,非得要操作数据库?前面不是说了关于手机号的唯一性?接口测试数据库断言?还有批量构造数据?NoNoNo,这不能算作理由,但可以进行风险评估,如果动作较大,建议出具必要的方案:如何动,怎么动,坏了怎么办?预案?如何恢复?等等这些步骤一个也不少的准备清楚,避免给公司正常运营造成经济损失。

二、数据库

这里不介绍如何操作数据库,而是说通过写python代码去操作数据库。sql语法是基础,而PyMySQL是需要掌握的;当然这里以MySQL数据库为例。

什么是数据验证

对于影响数据库表结构的接口,在测试的时候除了要验证接口的响应数据,还需要验证表数据的正确性,

通过计算对比都没问题了才认为测试通过,那么从请求到获取数据、再去检查数据的过程就是接口数据验证。

为什么需要操作数据库做数据验证?

例举操作数据库做数据验证的使用场景。

  • 接口测试,数据库结果断言?

请求接口返回数据,结果断言,需要拿到接口返回的数据去和数据库的数据进行比较?Excuse me,接口返回的数据不就是从数据库里面来的吗?为什么还需要自己去写sql,然后将查询的结果与接口返回的结果进行比较?

首先说一下接口的本质,它是函数,那么它的底层不就是对数据库的操作?以上做法,你是在质疑开发写的sql有毛病?有这个想法没毛病,开发写的任何东西都需要经得起测试。

好,假设没毛病!但对于另一类场景,例如用户账户余额,先查出余额,然后再支付使用了余额,最后查询账户还剩余多少,这个是可以的。因为前面的结果是测试用例计算的,而不是接口,接口也不见得一定会返回余额(因为前端也会计算,虽然不一定会这样做);除此之外,不管是充值还是支付,都会产生一条流水,对于账户余额的变动都可以做数据验证,流水也可以去校验,是否产生了流水、流水的金额是否与请求接口的数据一致、余额变动是否正确等等。

现在回到怎样做数据验证的问题上来

经过对上面问题的分析:不建议所有接口都做数据验证(程序代码任何操作都会给资源造成开销,数据库层面的操作过多,会给框架的执行效率带来麻烦,并且对数据库操作也有一定的风险),对于需要做数据验证的接口,咱们需要了解整个业务场景,前后可能变化的数据,数据库会产生怎样的业务数据,并准备对应的sql脚本即可;那么剩下的是框架设计。

三、PyMSQL

安装工具库:pip install pymssql

  • 先看网站案例⬇⬇⬇
conn = pymssql.connect(server, user, password, "tempdb")
cursor = conn.cursor(as_dict=True)cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
for row in cursor:print("ID=%d, Name=%s" % (row['id'], row['name']))conn.close()

这感觉,是不是简单粗暴多了;几行代码就完成了数据的访问和读取数据。

pymysql如何操作数据库

还记得之前的举例吗:如何将大象装进冰箱?

  • 第一步:创建数据库连接对象;服务器地址、帐号密码、数据库、端口等参数;
  • 第二步:拿到连接对象并获取游标,这里需要明白游标的概念:

科普:游标(cursor)是一个存储在mysql服务器上的数据库查询,它不是一条SELECT语句,而是被SELECT语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。

  • 第三步:操作sql语句,对于select语句而言没有commit也没有rollback,只有fetchone一条还是fetchall多条;
  • 第四步:先关闭游标(其实在执行完sql就需要关闭游标),再最后再关闭连接对象。
class HandleMySQL:"""通过ssh隧道连接内网阿里云数据库操作"""def __init__(self, mysql_host, mysql_db, mysql_account, mysql_passwd, mysql_port=3306):"""构造函数,初始化类属性,有些默认值"""# 与跳板机同局域网的内网访问地址self.mysql_accout = mysql_accountself.mysql_passwd = mysql_passwdself.mysql_host = mysql_hostself.mysql_port = mysql_portself.mysql_db = mysql_dbtry:# 创建数据连接对象self.con = pymysql.connect(host=self.mysql_host,port=self.mysql_port,user=self.mysql_accout,password=self.mysql_passwd,db=self.mysql_db,charset='utf8')except:logger.error("Database connection failed!")else:self.cur = self.con.cursor(cursor=pymysql.cursors.DictCursor)logger.info("Database connection successful!")def selectDB(self, sql):"""select数据库操作"""try:self.cur.execute(sql)datas = self.cur.fetchone()except:logger.error("Error: unable to fecth data")finally:self.cur.close()return datasdef usuallyDB(self, sql):r"""insert\update\delete数据库操作"""try:self.cur.execute(sql)self.con.commit()except:self.con.rollback()finally:self.cur.close()def closeDB(self):"""关闭数据库连接"""# self.cur.close() 在执行的时候已经关闭了游标self.con.close()

实际应用

前面讲了python如何使用pymysql操作mysql数据库;但是在接口自动化测试框架中如何设计使用呢?

  • 接口用例设计,在用例模版中预留两列,前后处理sql脚本,其他形式用例模版也可参考;
    在这里插入图片描述
  • 那sql脚本应该在测试用例中如何使用呢?

思考一下,咱们读取excel的用例作为数据源驱动测试用例的时候,是不是需要获取每一列,如果有数据的话,没有则单元格返回None;

# 是不是应该写在测试方法中,不建议是在setup/teardown这类前后置方法中(其实在excel用例也用不到这里去)
#
# 但是可以在setUpClass中创建mysql的连接对象,tearDownClass中关闭连接;
#
# 获取测试用例参数列
#
if pre_sql:r = pyConn.excute(sql)setattr(TestData,"id",r)
#
# 发送http请求并提取响应结果等操作
#
if post_sql:r = pyConn.excute(sql)setattr(TestData,"account",r)
#
# 写其他逻辑:如断言
#
self.assertEquels(r,actual,"断言成功")
  • 格式呢,差不多就这个意思,如果有什么不同的地方,这考量的就是各位对自家的业务流程熟练程度了。

四、总结

这应该是《接口自动化测试框架》,本框架中最后一个讲如何操作一个事物的内容了,不知大家有没有发现,不管是读配置文件、还是读取excel测试用例;它的步骤都是有迹可循的,先怎样(读取指定文件/连接服务器),再怎样(读取/操作数据),最后再怎样(一般都需要关闭资源/销毁对象),即使是一个完全陌生的功能库,咱们也应该能从源码中找到对应的API来写操作方法;如此一想,确实如此!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu安装terminator教程

Terminator 是一个高级的终端仿真器,专为 Linux 和 Unix 系统设计。它的主要特点是提供了丰富的多窗口和多标签功能,使用户能够在一个窗口中管理多个终端会话。这对于系统管理员、开发人员以及需要同时运行多个命令行任务的用户来说,极为方便。 一、安装 1、更新包 sudo a…

vue项目启动报错 vue与vue-template-compiler版本不一致

出现错误 Vue packages version mismatch: vue2.6.12 (/Users/work_ws/project/my/astar-education/astar-education-ui/node_modules/vue/dist/vue.runtime.common.js)vue-template-compiler2.6.13 (/Users/work_ws/project/my/astar-education/astar-education-ui/node_mod…

图中的最短环

2608. 图中的最短环 现有一个含 n 个顶点的 双向 图,每个顶点按从 0 到 n - 1 标记。图中的边由二维整数数组 edges 表示,其中 edges[i] [ui, vi] 表示顶点 ui 和 vi 之间存在一条边。每对顶点最多通过一条边连接,并且不存在与自身相连的顶…

Java1.2标准之重要特性及用法实例(十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列…

征服 Docker 镜像访问限制:KubeSphere v3.4.1 成功部署全攻略

近期,KubeSphere 社区的讨论中频繁出现关于 Docker 官方镜像仓库访问受限的问题。 本文旨在为您提供一个详细的指南, 展示在 Docker 官方镜像访问受限的情况下,如何通过 KubeKey v3.1.2 一次性成功部署 KubeSphere v3.4.1 以及 Kubernetes …

深入剖析:GaussDB与MySQL在COUNT查询中的并行化技术

引言 数据库查询性能优化是数据库管理和开发中的一个重要议题。在处理大数据量的COUNT查询时,传统的单线程处理方式可能无法满足现代应用的性能需求。GaussDB(for MySQL)和MySQL作为流行的数据库系统,它们在并行查询优化方面有着各自的策略和技术。本文…

Python批量采集某东评论,实现可视化分析

女朋友没事就喜欢网购,买一大堆又不用,总说不合适,为了不让她花冤枉钱,于是我决定用Python写一个采集商品评论的脚本,然后对商品进行分析,这样就不怕踩到坑了! 让我们直接开始本次操作 准备工作…

Python及Jupyter-Notebook安装

来源: “码农不会写诗”公众号 链接:Python及Jupyter-Notebook安装 文章目录 01 Python安装1.1 下载安装包1.2 双击安装包,开始安装1.3 选择安装配置1.4 选择需要安装的Optional Feature,点击Next1.5 选择需要安装的Advanced Feat…

Apache DolphinScheduler Worker Task执行原理解析

大家好,我是蔡顺峰,是白鲸开源的高级数据工程师,同时也是Apache DolphinScheduler社区的committer和PMC member。今天我要分享的主题是《Worker Task执行原理》。 整个分享会分为三个章节: Apache DolphinScheduler的介绍Apache …

Python3网络爬虫开发实战(3)网页数据的解析提取

文章目录 一、XPath1. 选取节点2. 查找某个特定的节点或者包含某个指定的值的节点3. XPath 运算符4. 节点轴5. 利用 lxml 使用 XPath 二、CSS三、Beautiful Soup1. 信息提取2. 嵌套选择3. 关联选择4. 方法选择器5. css 选择器 四、PyQuery1. 初始化2. css 选择器3. 信息提取4. …

一步步理清开源路径规划导航引擎GraphHopper

一步步理清开源路径规划导航引擎GraphHopper,学习应用 GraphHopper简介 源码用 Java 编写,开发人员可以通过 Maven 轻松上手。可以用作** Java 库**来计算两个或多个点之间路线的距离、时间、逐向指示和许多道路属性。可以用作独立的 Web 服务器来计算…

计算R velocity的方法和流程(CellRank2)

愿武艺晴小朋友一定得每天都开心 第一步:拿到cellranger count的文件夹; 运行cellranger count(这个得提前准备:R1和R2的fastq.gz文件 & 鼠的参考基因组文件) wget https://cf.10xgenomics.com/supp/cell-exp/refdata-gex-mm10-2020-A.tar.gz 最后会出现这个:Pipes…

C++简单实现消息队列

简介 消息队列是一种应用间的通讯方式,消息发送后可以立即放回,由消息系统来确保消息的可靠传递。消息发布者只需要将消息发布到消息队列中,而不需要管谁来取。消息使用者只管从消息队列中取消息而不管谁发布的。这样发布者和使用者都不同知…

21.发布确认模式-高级

问题 生产环境中由于一些不明原因,导致rabbitmq重启,在重启的期间生产者消息投递失败,导致消息丢失,需要手动处理恢复。那么如何才能进行rabbitmq的消息可靠性投递?特别是在极端的情况,rabbitmq集群不可用…

Python 教程(六):函数式编程

目录 专栏列表前言函数定义参数返回值 示例函数类型普通函数空函数匿名函数(Lambda 函数)嵌套函数函数装饰器高阶函数 函数参数位置参数默认参数可变位置参数可变关键字参数 函数属性和方法__name____doc__func.__dict__func.__defaults__func.__annotat…

黑马头条Day11- 实时计算热点文章、KafkaStream

一、今日内容 1. 定时计算与实时计算 2. 今日内容 KafkaStream 什么是流式计算KafkaStream概述KafkaStream入门案例SpringBoot集成KafkaStream 实时计算 用户行为发送消息KafkaStream聚合处理消息更新文章行为数量替换热点文章数据 二、实时流式计算 1. 概念 一般流式计…

4、Python+MySQL+Flask的文件管理系统【附源码,运行简单】

4、PythonMySQLFlask的文件管理系统【附源码,运行简单】 总览 1、《文件管理系统》1.1 方案设计说明书设计目标工具列表 2、详细设计2.1 登录2.2 注册2.3 个人中心界面2.4 文件上传界面2.5 其他功能贴图 3、下载 总览 自己做的项目,禁止转载&#xff0c…

UART 通信协议

文章目录 一 简介二 电平标准三 引脚定义四 数据格式五 波特率 一 简介 ​ UART (Universal Asynchronous Receiver/Transmitter),通用异步收发器,是一种串行、异步、全双工通信协议。 串行:利用一条传输线,将数据一位一位地传送…

【七】Hadoop3.3.4基于ubuntu24的分布式集群安装

文章目录 1. 下载和准备工作1.1 安装包下载1.2 前提条件 2. 安装过程STEP 1: 解压并配置Hadoop选择环境变量添加位置的原则检查环境变量是否生效 STEP 2: 配置Hadoop2.1. 修改core-site.xml2.2. 修改hdfs-site.xml2.3. 修改mapred-site.xml2.4. 修改yarn-site.xml2.5. 修改hado…

引用的项目“xxxx/tsconfig.node.json”可能不会禁用发出。

vue3 报错: 引用的项目“xxxx/tsconfig.node.json”可能不会禁用发出。 解决: 进入对应的 json 文件: 修改: "noEmit": false 当 noEmit 设置为 false 时,TypeScript 编译器将根据项目配置生成相应的输出文…