Files
apiautotest/utils/requests_utils/case_dependence.py

110 lines
5.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- 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.info(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.info(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.debug(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.info(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.debug("跳过用例依赖处理")
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