110 lines
5.4 KiB
Python
110 lines
5.4 KiB
Python
# -*- coding: utf-8 -*-
|
||
# @Time : 2023/12/18 9:16
|
||
# @Author : floraachy
|
||
# @File : case_dependence
|
||
# @Software: PyCharm
|
||
# @Desc:
|
||
|
||
# 第三方库导入
|
||
import allure
|
||
from loguru import logger
|
||
# 本地应用/模块导入
|
||
from settings import INTERFACE_DIR
|
||
from utils.requests_utils.request_control import RequestControl
|
||
from utils.data_utils.data_handle import data_handle
|
||
from utils.data_utils.extract_data_handle import json_extractor, re_extract
|
||
from utils.report_utils.allure_handle import allure_step
|
||
from common.database_utils.mysql_handle import MysqlServer
|
||
|
||
|
||
class CaseDependenceHandler:
|
||
"""
|
||
处理用例依赖,支持接口依赖,环境变量依赖,数据库查询依赖。关键字:variables, interface, database,
|
||
先处理环境变量依赖,再处理接口依赖,最后处理数据库查询依赖
|
||
"""
|
||
|
||
def __init__(self, source):
|
||
self.source = source
|
||
|
||
def handle_variables(self, variables):
|
||
"""处理环境变量依赖"""
|
||
for key, value in variables.items():
|
||
new_value = data_handle(value, self.source)
|
||
allure_step(f"依赖环境变量 --> {key}={new_value}")
|
||
logger.debug(f"依赖环境变量 --> {key}={new_value}")
|
||
self.source.update({key: new_value})
|
||
|
||
def handle_interfaces(self, interfaces):
|
||
"""处理接口依赖"""
|
||
request_control = RequestControl()
|
||
for interface in (interfaces if isinstance(interfaces, list) else [interfaces]):
|
||
api_data = request_control.get_api_data(api_file_path=INTERFACE_DIR, key=interface)
|
||
with allure.step(f"依赖接口:{api_data['title']}({interface})"):
|
||
result = request_control.api_request_flow(request_data=api_data, global_var=self.source)
|
||
self.source.update(result)
|
||
|
||
def handle_database_dependence(self, database_dependence, db_info: dict):
|
||
"""处理数据库依赖"""
|
||
if not db_info:
|
||
logger.error("数据库配置信息为空,请正确更新数据库信息以连接数据库")
|
||
return
|
||
mysql = MysqlServer(**db_info)
|
||
for db_item in (database_dependence if isinstance(database_dependence, list) else [database_dependence]):
|
||
if db_item.get("sql"):
|
||
sql = db_item["sql"]
|
||
sql_result = mysql.query_all(sql)
|
||
allure_step(f"依赖的数据库sql:{sql}, 查询结果:{sql_result}")
|
||
logger.debug(f"依赖的数据库sql:{sql}, 查询结果:{sql_result}")
|
||
db_item.pop("sql")
|
||
|
||
for extraction_type, extractions in db_item.items():
|
||
if extraction_type.lower() == "type_jsonpath":
|
||
for key, path in extractions.items():
|
||
res = json_extractor(sql_result, path)
|
||
self.source.update({key: res})
|
||
allure_step(f"通过jsonpath方式从数据库提取参数:{key}:{res}")
|
||
logger.trace(f"通过jsonpath方式从数据库提取参数:{key}:{res}")
|
||
elif extraction_type.lower() == "type_re":
|
||
for key, pattern in extractions.items():
|
||
res = re_extract(str(sql_result), pattern)
|
||
self.source.update({key: res})
|
||
allure_step(f"通过正则表达式从数据库提取参数:{key}:{res}")
|
||
logger.debug(f"通过正则表达式从数据库提取参数:{key}:{res}")
|
||
else:
|
||
logger.error(f"提取方式: {extraction_type} 错误,仅支持type_jsonpath、type_re两种")
|
||
else:
|
||
logger.error("数据库依赖参数必须传入sql")
|
||
|
||
def case_dependence_handle(self, case_dependence: dict, db_info: dict = None):
|
||
"""
|
||
处理用例依赖,支持接口依赖,环境变量依赖,SQL依赖。关键字:variables, interface, database,
|
||
先处理环境变量依赖,再处理接口依赖,最后处理SQL依赖
|
||
"""
|
||
if not case_dependence:
|
||
logger.trace("跳过用例依赖处理")
|
||
allure_step("跳过用例依赖处理")
|
||
return self.source
|
||
|
||
if case_dependence.get("variables"):
|
||
if isinstance(case_dependence["variables"], dict):
|
||
self.handle_variables(case_dependence["variables"])
|
||
else:
|
||
logger.error("依赖环境变量格式错误,跳过依赖环境变量处理~ --> variables仅支持dict格式")
|
||
|
||
if case_dependence.get("interface"):
|
||
interfaces = case_dependence["interface"]
|
||
if isinstance(interfaces, (str, list)):
|
||
self.handle_interfaces(interfaces)
|
||
else:
|
||
logger.error("依赖接口格式错误,跳过依赖接口处理~ --> interface 仅支持str和list格式")
|
||
|
||
if case_dependence.get("database") and db_info:
|
||
database_dependence = case_dependence["database"]
|
||
if isinstance(database_dependence, (dict, list)):
|
||
self.handle_database_dependence(database_dependence, db_info)
|
||
else:
|
||
logger.error("依赖数据库格式错误,跳过依赖数据库处理~ --> database 仅支持dict和list格式")
|
||
else:
|
||
logger.error("数据库依赖参数必须传入db_info, 以及检查关键字 database是否正确")
|
||
return self.source
|