方法1:处理数据库方法
说明:数据库配置文件,主要存放数据库连接信息
settings.py文件
mysql_info = {
"host": "xxxxx",
"user": "xxxxx",
"password": "xxxxx",
"port": 3306,
"charset": "utf8mb4",
"database": "xxxxx",
"autocommit": True
}
方法2:处理数据库结果方法
作用:处理数据库查询行数以及查询结果
handle_mysql.py文件
import pymysql
from loguru import logger
class HandleMysql:
#连接数据库,初始化
def __init__(self,**kwargs):
self.conn = pymysql.connect(**kwargs,cursorclass=pymysql.cursors.DictCursor)
#创建游标
self.cur = pymysql.conn.curcor()
#获取影响行数
def select_and_get_row_counts(self,query_sql):
logger.info(f"执行的sql语句是{query_sql}")
counts = self.cur.execute(query_sql)
logger.info(f"影响的行数是{counts}")
return counts
#获取影响数据
def select_and_get_datas(self,query_sql,many=1):
"""
:param query_sql: 执行sql语句
:param many: many = 1 代表fetchone,many > 1 代表fetchmany,many < 1 代表fetchall
:return:
"""
counts = self.select_and_get_row_counts(query_sql)
if counts > 0:
if many == 1:
data = self.cur.fetchone()
elif many > 1:
data = self.cur.fetchmany()
else:
data = self.cur.fetchall()
logger.info(f"影响行数是{many},获取到的数据是{data}")
return data
#关闭数据库
def close_db(self):
self.cur.close()
self.conn.close()
方法3:excel中前置sql语句执行处理方法
作用:在测试数据中可能会需要在数据库中查询结果来使用,所以在excel中写sql语句执行出来的结果设置为全局变量
handle_pre_sql.py文件
from loguru import logger
from settings import mysql_info
from tools.handle_mysql import HandleMysql
from tools.handle_global_data import GlobalData
from tools.handle_replace import replace_mark_by_data
#执行sql语句,设置全局变量
def execute_presql_and_set_globaldata(pre_sql):
#首先替换sql语句里面的数据
new_pre_sql = replace_mark_by_data(pre_sql)
logger.info(f"替换后的sql语句是{new_pre_sql}")
#连接数据库
hmysql = HandleMysql(**mysql_info)
#执行sql语句
dict_data = hmysql.select_and_get_datas(new_pre_sql)
logger.info(f"查询出来的数据是{dict_data}")
#设置全局变量
for key,value in dict_data.items():
setattr(GlobalData,"key","value")
logger.info(f"设置的全局变量名为{key},值是{value}")
#关闭数据库
hmysql.close_db()
方法4:exce预期结果断言方法
作用:提前准备好断言字段,然后在执行用例的时候将结果与excel中的预期结果部分进行断言
from loguru import logger
from tools.handle_replace import replace_mark_by_data
def assert_resp_data(resp_text,expected_str):
"""
:param resp_text: 响应数据
:param expected_str: 期望断言数据
:return:
"""
logger.info("开始断言响应数据......")
#替换
expected_str = replace_mark_by_data(expected_str)
#将数据转换成列表
assert_data_list = eval(expected_str)
for assert_str in assert_data_list:
logger.info(f"断言响应结果预期是{assert_str}")
try:
assert assert_str in resp_text
logger.info("断言成功")
except:
logger.info(f"断言失败")
raise
# 面临的问题:有多个断言条件,某一个断言失败了,那剩下的断言就不会执行了。。
# pytest有一个第三方库:pytest-assume -- 某个断言失败了不影响下一个断言执行 -- 自行拓展
方法5:数据库断言方法
作用:提取数据库中的结果进行断言
这里的excel中的数据库断言语句格式是:
[ {"sql": 'select * from tz_user where user_mobile="#new_phone#"', "compare_type": "int", "check": 1}, {"sql": 'select level_type from tz_user where user_mobile="#new_phone#"', "compare_type": "dict", "check": {"level_type": 0}} ]
from loguru import logger
from settings import mysql_info
from tools.handle_mysql import HandleMysql
from tools.handle_replace import replace_mark_by_data
def assert_db(assert_db_str):
"""
:param assert_db_str: excel中的数据库断言字段
:return:
"""
#先替换
assert_db_str = replace_mark_by_data(assert_db_str)
#再转换成列表
assert_db_list = eval(assert_db_str)
#连接数据库
hmysql = HandleMysql(**mysql_info)
for one_assert in assert_db_list:
if one_assert.get("compare_type") == "int":
logger.info("执行sql语句,获取执行结果行数")
result = hmysql.select_and_get_row_counts(one_assert.get("sql"))
else:
logger.info("执行sql语句,获取数据")
result = hmysql.select_and_get_datas(one_assert.get("sql"))
#对比实际与期望是否相等
logger.info(f"实际结果为{result}")
logger.info(f'期望结果为{one_assert.get("check")}')
try:
assert result == one_assert.get("check")
logger.info("断言成功")
except:
logger.info("断言失败")
raise
hmysql.close_db()