做测试的时候总是有些场景需要用到数据库的:
场景一: 查询并获取数据-- 比如验证码查询【测试环境里】
场景二:构造测试数据避免重复,查询校验数据是重复 – 用户名 手机号码
不能重复。
场景三: 进行数据库数据确认,确认测试结果;数据库断言。
接口测试 没有界面直观判断。
常见数据操作的库:
引入操作Oracle数据库模块安装命令: pip install cx_Oracle
引入操作SQLServer数据库模块安装命令: pip install pymssql
引入操作MySQL数据库模块安装命令: pip install PyMySQL
SQLite数据模块不需要安装,系统自带。
选择pymysql。其他的数据库功能库操作语法大同小异,可以触类旁通。
安装
pymysql 第三方库 == 安装 导入
import pymysql
# 第一步:连接数据库,获取对象
conn = pymysql.connect(
user="xxxxxx",
password="xxxxx",
database="xxxxx",
port=3306,
host="xxx.xxxx.com",
charset="utf8mb4", # 中文字符集 语法记住即可
)
cur.fetchone() – # 从查询集结果当中,获取一条数据
cur.fetchmany(size=行数) — # 从查询结果集当中,获取指定条数的数据。
cur.fetchall() — # 从查询结果集当中,获取所有的数据。
- 执行结果是元组的格式保存,每个表的字段的值作为元组的元素。
(3006, ‘13555554444’, ‘13555554444’, ‘验证码464323,您正在注册成为新用户,感谢您的支持!’, ‘464323’, 12, datetime.datetime(2023, 11, 22, 20, 12, 21), None, 0) - 多条结果: 元组嵌套元组的格式保存数据。
注意: 数据读取从游标位置读取。前面的查询语句会影响后面的查询结果。如果不想要影响,可以每次查询新的sql,新创建游标
思考: 数据库结果默认放在元组里,不方便识别数据类型和意义。最好能放在字典格式里 标识数据更好。
cursorclass=pymysql.cursors.DictCursor # 数据库查询结果就是字典的格式保存。
- 直接用数据库表的字段名字作为字典的key作为标识。
- 一条结果是字典格式
- 多条结果,列表嵌套字典的格式。
import pymysql
from pymysql.cursors import DictCursor
# 第一步:连接数据库 获取对象
conn = pymysql.connect(
user="xxxxxx", #用户名
password="xxxxx", #密码
database="xxxxxx", #数据库名字
port=3306, #端口
host="xxxx.xxxxx.xxxx", #域名
charset="utf8mb4",
cursorclass=DictCursor # 数据库查询结果就是字典的格式保存。
)
# 第二步:查询(执行sql语句),执行之前,需要获取游标
cursor = conn.cursor()
# 第三步:执行sql == 得到查询结果的数量 没有得到具体的执行数据
# sql = 'select * from tz_sms_log where user_phone = "13555554444" order by rec_date desc limit 1;'
sql = 'select * from tz_sms_log where user_phone like "1355%";'
result = cursor.execute(sql)
print(result)
# 第四步:获取具体的数据结果 ==第一行的数据
# one_row_data = cursor.fetchone()
# print(one_row_data)
# 获取具体的数据结果 ==获取多条数据,从上一次查询完成后的游标处开始获取数据。
many_data = cursor.fetchmany(size = None)
print(many_data)
# 新创建游标 不会受之前查询结果影响了。
# cursor2 = conn.cursor()
# result = cursor2.execute(sql)
# # 获取所有的结果数据 -fetchall
# all_data = cursor2.fetchall()
# print(all_data)
# 第五步: 关闭游标 和 数据库连接 : 数据库连接有数量限制,用完了这个链接 关闭链接。 释放出来。
cursor.close()
# cursor2.close()
conn.close()
运行结果如下:
30
[{'id': 429, 'user_id': '13552460107', 'user_phone': '13552460107', 'content': '验证码819958,您正在登录,若非本人操作,请勿泄露。', 'mobile_code': '819958', 'type': 13, 'rec_date': datetime.datetime(2023, 1, 13, 19, 46, 48), 'response_code': None, 'status': 0}]
数据库封装
封装类:查询操作,如果以后还要封装update 可以扩展方法。
封装类考虑以下步骤:
1、是否初始化函数init : 每个方法需要共享属性–实例属性。
2、考虑这个类里面需要有哪些方法: 动作和操作 ==查询
- 函数封装步骤:
- 函数体
- def : 需要调用实例属性
- 参数化
- 返回值
3、异常捕获:
4、结合日志 记录日志。
设计一下: 用户想要查询几条数据参数。–代码设计 参考成熟工具设计。 参考Jmeter: 1 2 -1
- match_num=1,fetchone
- match_num=2,fetchmany
- match_num=-1,fetchall
my_db.py内容如下:
my_db = {
"user": "xxxxx", #用户名
"password": "xxxxx", #密码
"database": "xxxxxx", #数据库名字
"port": 3306, #端口
"host": "xxxx.xxxxx.xxxx"} #域名
import pymysql
from pymysql.cursors import DictCursor
from loguru import logger
from datas.db_data import my_db
class HandleMysql:
def __init__(self,user,password,database,port,host):
"""
定义了两个实例属性: conn cursor ,可以用于后续实例方法共享。
"""
self.conn = pymysql.connect(
user=user,
password=password,
database=database,
port=port,
host=host,
charset="utf8mb4",
cursorclass=DictCursor)
self.cursor = self.conn.cursor()
def query_data(self,query_sql,match_num=1,size=None):
"""
:param query_sql: 查询sql语句
:param match_num: 用户获取条数 match_num=1,fetchone;match_num=2,fetchmany,match_num=-1,fetchall
:param size:当match_num=2,size是查询的条数,传参。
:return: 返回查询结果数据
"""
try:
result = self.cursor.execute(query_sql) # 结果条数 >0 才有获取详细数据必要
logger.info(f"数据库的查询结果条数为:{result}")
if result > 0:
if match_num==1:
data = self.cursor.fetchone()
logger.info(f"查询结果数据为:{data}")
return data
elif match_num == 2:
data = self.cursor.fetchmany(size = size)
logger.info(f"查询结果数据为:{data}")
return data
elif match_num == -1:
data = self.cursor.fetchall()
logger.info(f"查询结果数据为:{data}")
return data
logger.warning("请传入1,2,-1的match_num")
logger.info("数据库没有查询结果!")
except:
logger.error("数据库操作异常!")
finally:
self.cursor.close()
self.conn.close()
if __name__ == '__main__':
sql = 'select * from tz_sms_log where user_phone like "1355%";'
result = HandleMysql(**my_db).query_data(sql,match_num=2,size=5)
print(result)