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…

【Python】计算游戏得分

一、题目 Kevin and Stuart want to play the The Minion Game. Game Rules Both players are given the san string S.Both players have to make substrings using the letters of the string S.Stuart has to make words starting with consonants.Kevin has to make wor…

Could not find a package configuration file provided by “catkin_simple“ 的参考解决方法

文章目录 写在前面一、问题描述二、解决方法参考链接 写在前面 自己的测试环境: Ubuntu20.04 ROS-Noetic 一、问题描述 CMake Error at /***/CMakeLists.txt:4 (find_package):By not providing "Findcatkin_simple.cmake" in CMAKE_MODULE_PATH thisp…

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 之间存在一条边。每对顶点最多通过一条边连接,并且不存在与自身相连的顶…

Hive——UDF函数:高德地图API逆地理编码,实现离线解析经纬度转换省市区(离线地址库,非调用高德API)

文章目录 1. 需求背景数据现状业务需求面临技术问题寻求其他方案 2. 运行环境软件版本Maven依赖 3. 获取离线地址库4. Hive UDF函数实现5. 创建Hive UDF函数6. 参考 1. 需求背景 数据现状 目前业务系统某数据库表中记录了约3亿条用户行为数据,其中两列记录了用户触…

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

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

SciPy 与 MATLAB 数组

SciPy 与 MATLAB 数组 SciPy 是一个开源的 Python 库,广泛用于科学和工程计算。它构建在 NumPy 数组的基础之上,提供了许多高级科学计算功能。MATLAB 是一个高性能的数值计算环境,它也使用数组作为其基础数据结构。在这篇文章中,我们将探讨 SciPy 和 MATLAB 在数组操作上的…

征服 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 服务器来计算…

CLI是命令行界面(Command-Line Interface)的缩写

CLI是命令行界面(Command-Line Interface)的缩写。它是一种用户界面,允许用户通过键盘输入文本命令来与计算机进行交互。CLI在图形用户界面(GUI)普及之前是最常用的用户界面类型。 CLI的特点: 高效性&…

CentOS下原生态安装mysql,推荐yum

mysql 是一个关系型数据库管理系统,是最流行的关系型数据库管理系统之一,本文将介绍如何在 CentOS 7.x 中安装 mysql 。 安装mysql mysql 的安装方法可以通过以下几种方式进行: 1、通过第三方面板安装 mysql 2、通过 yum 命令安装 mysql 3、…

计算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++简单实现消息队列

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