import ast
from api.conf.setting import assert_db_info
from api.tools.handle_replace import HandleReplace
from api.tools.handle_db import HandleDb
from api.tools.handle_response import HandleResponse
# 数据库断言
class HandleAssertDb:
"""
思路:
1、图片上传接口,返回的是图片上传后的路径,存在tz_attach_file表的file_path字段
2、将返回的路径提取出来,做成全局变量(HandleAttr类属性)
3、去excel中增加assert_db字段,写期望结果,和实际结果数据
{"expected_data": 1, "actual_data": "select count(1) from tz_attach_file where file_path ='2024/03/c2876474841b479dab280a9b1cfc63a2.png'"}
4、获取excel中assert_db字段,拿到实际结果actual_data,替换sql语句,再执行sql语句,获取执行结果
5、拿expected_data的值与actual_data中sql语句执行的结果进行对比断言
"""
def __init__(self):
# 参数替换类
self.replace_data = HandleReplace()
# 数据库操作
self.handle_db = HandleDb()
# 统一从HandleResponse类断言的类里面去断言
self.handle_response = HandleResponse()
# 删除换行符和空格 data:str给变量data制定数据格式,好处,可以使用制定格式的方法
def __delete_space_wraps(self, data: str):
"""
:param data:excel中获取的请求参数
:return: 去掉空格和换行符的请求参数
"""
for str_data in ["\n"]: # assert_db不能存在空格
data = data.replace(str_data, "")
return data
def assert_db(self, assert_db): # expected_data,actual_data取数来源读取excel中的assert_db,数据库断言
"""
:param assert_db: excel中的assert_db字段
assert_db_info:配置文件setting中读取
:return:
"""
if assert_db: # 判断是否需要进行sql断言
# 去除空格和换行
assert_db = self.__delete_space_wraps(assert_db)
# 三元运算判断assert_db数据类型是否为dict
assert_db = assert_db if isinstance(assert_db, dict) else ast.literal_eval(assert_db)
# 拿到预期结果和实际结果
expected_data = assert_db["expected_data"]
sql = assert_db["actual_data"]
# 拿到实际结果extract_data,替换sql语句
new_sql = self.replace_data.replace_sql(sql=sql)
# 操作数据库,拿到入库数据
actual_data = self.handle_db.get_data(sql=new_sql) # extract_data=[1] int类型
# 数据断言
self.handle_response.assert_db(expected_data, actual_data[0])
else:
print("excel中assert_db为空,无需进行mysql断言")