Python接口测试实战3(上)- Python操作数据库
课程目录
Python接口测试实战1(上)- 接口测试理论
Python接口测试实战1(下)- 接口测试工具的使用
Python接口测试实战2 - 使用Python发送请求
Python接口测试实战3(上)- Python操作数据库
Python接口测试实战3(下)- unittest测试框架
Python接口测试实战4(上) - 接口测试框架实战
Python接口测试实战4(下) - 框架完善:用例基类,用例标签,重新运行上次失败用例
Python接口测试实战5(上) - Git及Jenkins持续集成
Python接口测试实战5(下) - RESTful、Web Service及Mock Server
更多学习资料请加添加作者微信:lockingfree获取
PDF下载:链接:https://pan.baidu.com/s/1OwAa8nl1eeBj8fcrgd3sBA 密码:e9d8
本节内容
- 数据库操作
- 封装数据库操作
前言
在功能、接口测试中常常需要通过数据库的操作,来准备数据、检测环境及核对功能、接口的数据库操作是否正确。
在自动化测试中,就需要我们用代码连接数据库自动完成数据准备、环境检查及数据库断言的功能。
使用Python操作MySQL数据库这里我们需要用到三方库PyMySQl
安装方法:
pip install pymysql
数据库操作
- 建立数据库连接
conn = pymysql.connect() - 从连接建立操作游标
cur = conn.cursor() - 使用游标执行sql(读/写)
cur.execute(sql) - 获取结果(读)/ 提交更改(写)
cur.fetchall()/conn.commit() - 关闭游标及连接
cur.close();conn.close()
import pymysql
# 1. 建立连接
conn = pymysql.connect(host='127.0.0.1',
port=3306,
user='root',
passwd='123456', # password也可以
db='api_test',
charset='utf8') # 如果查询有中文需要指定数据库编码
# 2. 从连接建立游标(有了游标才能操作数据库)
cur = conn.cursor()
# 3. 查询数据库(读)
cur.execute("select * from user where name='张三'")
# 4. 获取查询结果
result = cur.fetchall()
print(result)
# 3. 更改数据库(写)
cur.execute("delete from user where name='李四'")
# 4. 提交更改
conn.commit() # 注意是用的conn不是cur
# 5. 关闭游标及连接
cur.close()
conn.close()
什么是游标? 游标类似文件句柄,可以逐条的访问数据库执行结果集。pymysql中只能通过游标来执行sql和获取结果
查询操作
使用cur.execute(), 执行数据库查询后无返回的是影响的行数,而非查询结果。我们要使用cur.fetchone()/cur.fetchmany()/cur.fetchall()来获取查询结果
- cur.fetchone(): 获取一条数据(同时获取的数据会从结果集删除),返回元祖
('张三','123456') - cur.fetchmany(3): 获取多条数据,返回嵌套元祖
(('张三','123456'),('李四','123456'),("王五","123456")) - cur.fetchall(): 获取所有数据,返回嵌套元祖,
(('张三','123456'),)(只有一条数据时)
注意: 获取完数据后,数据会从数据集中删除,再次获取获取不到,如:
cur.execute(select * from user where name='张三')
print(cur.fetchone()) # 结果: ('张三','123456')
print(cur.fetchone()) # 结果:None
print(cur.fetchall()) # 结果:()
所以我们需要重复使用查询结果时,需要将查询结果赋给某个变量
cur.execute(select * from user where name='张三')
result = cur.fetchall()
print(result) # 结果: ('张三','123456')
print(result) # 结果: ('张三','123456')
修改操作
执行修改数据库的操作后不立即生效,使用连接conn.commit()提交后才生效,支持事物及回滚
try:
cur.execute("insert into user (name,password) values ('张三', '123456')")
cur.execute("insert into user (name, passwd) values ('李四'), '123456'") # 此处sql出错
conn.commit() # 使用连接提交所有更改
except Exception as e:
conn.rollback() # 回滚所有更改(注意用的是conn)
print(str(e))
封装数据库操作
由于经常要使用到数据库操作,建议将所有数据库操作封装成公用的数据库模块
- 新建db.py, 代码如下:
import pymysql
# 获取连接方法
import pymysql
# 获取连接方法
def get_db_conn():
conn = pymysql.connect(host='127.0.0.1',
port=3306,
user='test',
passwd='123456',
db='api_test',
charset='utf8') # 如果查询有中文,需要指定测试集编码
return conn
# 封装数据库查询操作
def query_db(sql):
conn = get_db_conn() # 获取连接
cur = conn.cursor() # 建立游标
cur.execute(sql) # 执行sql
result = cur.fetchall() # 获取所有查询结果
cur.close() # 关闭游标
conn.close() # 关闭连接
return result # 返回结果
# 封装更改数据库操作
def change_db(sql):
conn = get_db_conn() # 获取连接
cur = conn.cursor() # 建立游标
try:
cur.execute(sql) # 执行sql
conn.commit() # 提交更改
except Exception as e:
conn.rollback() # 回滚
finally:
cur.close() # 关闭游标
conn.close() # 关闭连接
# 封装常用数据库操作
def check_user(name):
# 注意sql中''号嵌套的问题
sql = "select * from user where name = '{}'".format(name)
result = query_db(sql)
return True if result else False
def add_user(name, password):
sql = "insert into user (name, passwd) values ('{}','{}')".format(name, password)
change_db(sql)
def del_user(name):
sql = "delete from user where name='{}'".format(name)
change_db(sql)
相比用例中直接使用sql操作数据库,封装常用的数据库操作会更安全
- 调用方法(其他模块)
from db import *
if check_user("张三"):
del_user("张三")
补充:另一种封装方法
由于上面这种封装方法,每一次查询都会建立一次数据库连接,效率较低,也可以采用下面面向对象的封装方法
db2.py
import pymysql
class DB:
def __init__(self):
self.conn = pymysql.connect(host='127.0.0.1',
port=3306,
user='root',
passwd='123456', # passwd 不是 password
db='api_test')
self.cur = self.conn.cursor()
def __del__(self): # 析构函数,实例删除时触发
self.cur.close()
self.conn.close()
def query(self, sql):
self.cur.execute(sql)
return self.cur.fetchall()
def exec(self, sql):
try:
self.cur.execute(sql)
self.conn.commit()
except Exception as e:
self.conn.rollback()
print(str(e))
def check_user(self,name):
result = self.query("select * from user where name='{}'".format(name))
return True if result else False
def del_user(self, name)
self.exec("delete from user where name='{}'".format(name))
使用方法
from db2 import DB:
db = DB() # 实例化一个数据库操作对象
if db.check_user("张三"):
db.del_user("张三")
后言
- 数据库连接信息建议写到配置文件中,从配置文件中读取
- sql语句建议先在手工测试一下没有语法问题再进行封装
- 通过封装各种sql可以完成各种业务操作
- 更改数据库有风险,操作需谨慎!!!
此为北京龙腾育才 Python高级自动化(接口测试部分)授课笔记
课程介绍
想要参加现场(北京)/网络课程的可以联系作者微信:lockingfree
- 高效学习,快速掌握Python自动化所有领域技能
- 同步快速解决各种问题
- 配套实战项目练习
Python接口测试实战3(上)- Python操作数据库的更多相关文章
- Python接口测试实战2 - 使用Python发送请求
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
- Python接口测试实战1(上)- 接口测试理论
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
- Python接口测试实战5(上) - Git及Jenkins持续集成
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
- Python接口测试实战4(上) - 接口测试框架实战
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
- Python接口测试实战4(下) - 框架完善:用例基类,用例标签,重新运行上次失败用例
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
- Python接口测试实战5(下) - RESTful、Web Service及Mock Server
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
- Python接口测试实战3(下)- unittest测试框架
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
- Python接口测试实战1(下)- 接口测试工具的使用
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
- python学习笔记(十 二)、操作数据库
每一种语言都少不了多数据库进行各种操作. python支持多种数据库.有关python支持的数据库清单,请参阅:https://wiki.python.org/moin/DatabaseInterfa ...
随机推荐
- sqoop2启动client异常
java环境: java version "10.0.1" ,启动sqoop-shell端或者是sqoop-client端异常,异常如下: [root@hadoop1 home] ...
- SSM框架优缺点和spring boot 比起优缺点是什么?
一.SSM优缺点应该分开来说的,比如 1)spring 不说了,核心ioc.aop技术,ioc解耦,使得代码复用,可维护性大幅度提升,aop提供切面编程,同样的增强了生产力. 2)spring mvc ...
- 【题解】洛谷P1966 [NOIP2013TG] 火柴排队(树状数组+逆序对)
次元传送门:洛谷P1966 思路 显然在两排中 每排第i小的分别对应就可取得最小值(对此不给予证明懒) 所以我们只在意两排的火柴是第几根 高度只需要用来进行排序(先把两个序列改成有序的方便离散化) 因 ...
- "strace -p"非常有用,它减少了很多猜测工作,也不需要重新启动应用。lsof -p process_id +iostat + sar -n DEV 1
linux神器strace - youxin - 博客园https://www.cnblogs.com/youxin/p/8837771.html 某个进程突然占用了很多CPU? 或者某个进程看起来像 ...
- gdb调试时的问题Missing separate debuginfos, use: debuginfo-install glibc-XXX
在CentOS6.4下使用gdb进行调试的时候, 使用bt(breaktrace)命令时,会弹出如下的提示: 头一天提示: Missing separate debuginfos, use: debu ...
- C#实体更新指定的字段
接口类: /// <summary> /// 更新指定字段 /// </summary> /// <param name="entity">实体 ...
- 使用XWAF框架(1)——Web项目的代码分层
建议在Eclipse环境下使用XWAF框架来开发用户的Web项目,并遵循以下步骤和约定. 1.获取XWAF框架压缩包文件 程序员点击下列地址免费下载XWAF框架的压缩包文件:XWAF框架压缩文件 2. ...
- DataGuard相关视图
1.v$database SELECT name,open_mode,database_role,protection_mode,protection_level FROM v$database; 其 ...
- RHS 和 LHS
不成功的的RHS 引用会导致抛出 ReferenceError异常 不成的的LHS 引用会导致自动隐式地创建一个全局变量(非严格模式下) function foo(a) { var b = a; ...
- MySQL无法启动重启竟是因为改了Linux主机名
MySQL无法重启.无法关闭.无法启动.无法使用,如果是因为修改了主机名,可以这样解决:关闭掉所有mysql进程,然后在启动一些mysql! 有时候,只要执行如下MySQL初始化命令即可解决:/usr ...