1. 增加接口响应耗时计算 2. 支持url中进行参数替换 3. 优化日志

This commit is contained in:
floraachy
2023-05-27 10:19:50 +08:00
parent 0bd26eea8b
commit bb6962ca7f

View File

@@ -24,20 +24,20 @@ class RequestPreDataHandle:
"""
def __init__(self, request_data):
logger.info(f"\n======================================================\n" \
"-------------Start处理用例数据前--------------------\n"
f"用例标题: {request_data.get('title', None)}\n" \
f"请求路径: {request_data.get('url', None)}\n" \
f"请求方式: {request_data.get('method', None)}\n" \
f"请求头: {request_data.get('headers', None)}\n" \
f"请求cookies: {request_data.get('cookies', None)}\n" \
f"请求关键字: {request_data.get('pk', None)}\n" \
f"请求内容: {request_data.get('payload', None)}\n" \
f"请求文件: {request_data.get('files', None)}\n" \
f"后置提取参数: {request_data.get('extract', None)}\n" \
f"响应断言: {request_data.get('assert_response', None)}\n" \
f"数据库断言: {request_data.get('assert_sql', None)}\n" \
"=====================================================")
logger.debug(f"\n======================================================\n" \
"-------------Start处理用例数据前--------------------\n"
f"用例标题: {request_data.get('title', None)}\n" \
f"请求路径: {request_data.get('url', None)}\n" \
f"请求方式: {request_data.get('method', None)}\n" \
f"请求头: {request_data.get('headers', None)}\n" \
f"请求cookies: {request_data.get('cookies', None)}\n" \
f"请求关键字: {request_data.get('pk', None)}\n" \
f"请求内容: {request_data.get('payload', None)}\n" \
f"请求文件: {request_data.get('files', None)}\n" \
f"后置提取参数: {request_data.get('extract', None)}\n" \
f"响应断言: {request_data.get('assert_response', None)}\n" \
f"数据库断言: {request_data.get('assert_sql', None)}\n" \
"=====================================================")
self.request_data = request_data
def request_data_handle(self):
@@ -52,26 +52,29 @@ class RequestPreDataHandle:
self.files_handle()
self.extract_handle()
self.assert_handle()
logger.info(f"\n======================================================\n" \
"-------------End处理用例数据后--------------------\n"
f"用例标题: {self.request_data.get('title', None)}\n" \
f"请求路径: {self.request_data.get('url', None)}\n" \
f"请求方式: {self.request_data.get('method', None)}\n" \
f"请求头: {self.request_data.get('headers', None)}\n" \
f"请求cookies: {self.request_data.get('cookies', None)}\n" \
f"请求关键字: {self.request_data.get('pk', None)}\n" \
f"请求内容: {self.request_data.get('payload', None)}\n" \
f"请求文件: {self.request_data.get('files', None)}\n" \
f"后置提取参数: {self.request_data.get('extract', None)}\n" \
f"响应断言: {self.request_data.get('assert_response', None)}\n" \
f"数据库断言: {self.request_data.get('assert_sql', None)}\n" \
"=====================================================")
logger.debug(f"\n======================================================\n" \
"-------------End处理用例数据后--------------------\n"
f"用例标题: {self.request_data.get('title', None)}\n" \
f"请求路径: {self.request_data.get('url', None)}\n" \
f"请求方式: {self.request_data.get('method', None)}\n" \
f"请求头: {self.request_data.get('headers', None)}\n" \
f"请求cookies: {self.request_data.get('cookies', None)}\n" \
f"请求关键字: {self.request_data.get('pk', None)}\n" \
f"请求内容: {self.request_data.get('payload', None)}\n" \
f"请求文件: {self.request_data.get('files', None)}\n" \
f"后置提取参数: {self.request_data.get('extract', None)}\n" \
f"响应断言: {self.request_data.get('assert_response', None)}\n" \
f"数据库断言: {self.request_data.get('assert_sql', None)}\n" \
"=====================================================")
return self.request_data
def url_handle(self):
"""
用例数据中获取到的url(一般是不带host的个别特殊的带有host则不进行处理)
"""
# 检测url中是否存在需要替换的参数如果存在则进行替换
data_replace(content=self.request_data.get("url", None), source=GLOBAL_VARS)
# 进行url处理最终得到full_url
host = GLOBAL_VARS.get("host", "")
url = self.request_data.get("url", "")
# 从用例数据中获取url如果键url不存在则返回空字符串
@@ -143,12 +146,11 @@ class RequestHandle:
def __init__(self, case_data):
self.case_data = case_data
def send_request_extract(self):
def http_request(self):
"""
发送请求并进行后置参数提取操作
"""
response = BaseRequest.send_request(self.case_data)
self.case_data["extract"] = self.after_extract(response, self.case_data.get("extract", None))
# 处理数据库断言 - 从全局变量中获取最新值,替换数据库断言中的参数
if self.case_data.get('assert_sql', None):
self.case_data["assert_sql"] = eval_data_process(
@@ -164,8 +166,8 @@ class RequestHandle:
f"请求内容: {self.case_data.get('payload', None)}\n" \
f"请求文件: {self.case_data.get('files', None)}\n" \
f"请求响应数据: {response.text}\n" \
f"后置提取参数(新): {self.case_data.get('extract', None)}\n" \
f"数据库断言: {self.case_data.get('assert_sql', None)}\n" \
f"请求响应码: {response.status_code}\n" \
f"响应耗时: {round(response.elapsed.total_seconds(), 2)} s || {round(response.elapsed.total_seconds() * 1000, 2)} ms\n" \
"=====================================================")
allure_step(step_title=f"请求地址:{self.case_data['url']}")
allure_step(step_title=f"请求方式:{self.case_data['method']}")
@@ -173,38 +175,45 @@ class RequestHandle:
allure_step(step_title="请求Cookies", content=self.case_data['cookies'])
allure_step(step_title="请求参数", content=self.case_data['payload'])
allure_step(step_title="请求文件", content=self.case_data['files'])
allure_step(step_title="后置提取参数(新)", content=self.case_data['extract'])
allure_step(step_title="响应断言参数", content=self.case_data['assert_response'])
allure_step(step_title="数据库断言", content=self.case_data['assert_sql'])
allure_step(step_title="请求响应数据", content=response.text)
allure_step(step_title=f"请求响应码:{response.status_code}")
allure_step(step_title=f"响应耗时:{round(response.elapsed.total_seconds(), 2)} s || {round(response.elapsed.total_seconds() * 1000, 2)} ms")
return response
def after_extract(self, response: Response, extract):
"""
从响应数据中提取请求后的参数,并保存到全局变量中
:param response: request 响应对象
:param extract: 需要提取的参数字典 '{"k1": "$.data"}''{"k1": "data:(.*?)$"}'
:return:
"""
logger.debug(f"-----Start-----请求后的参数提取处理,需要提取的参数:{extract}-----")
result = {}
if extract:
if response_type(response) == "json":
# 如果响应数据是json格式则将按照json方式对后置提取参数进行处理
res = response.json()
for k, v in extract.items():
result[k] = json_extractor(res, v)
else:
# 如果响应数据是str格式,则将按照str方式对后置提取参数进行处理
res = response.text
for k, v in extract.items():
result[k] = re_extract(res, v)
logger.debug(f"-----End-----参数提取后,打印提取到的变量:{result}")
# 将提取到的变量保存在全局变量中
if result:
for k, v in result.items():
GLOBAL_VARS[k] = v
return result
# ---------------------------------------- 请求后的参数提取处理----------------------------------------#
def after_request_extract(response: Response, extract):
"""
从响应数据中提取请求后的参数,并保存到全局变量中
:param response: request 响应对象
:param extract: 需要提取的参数字典 '{"k1": "$.data"}''{"k1": "data:(.*?)$"}'
:return:
"""
logger.debug(f"\n======================================================\n" \
"-------------Start从响应数据中提取后置参数保存到全局变量--------------------\n"
f"后置提取参数(原): {extract}\n" \
"=====================================================")
result = {}
if extract:
if response_type(response) == "json":
# 如果响应数据是json格式,则将按照json方式对后置提取参数进行处理
res = response.json()
for k, v in extract.items():
result[k] = json_extractor(res, v)
else:
# 如果响应数据是str格式则将按照str方式对后置提取参数进行处理
res = response.text
for k, v in extract.items():
result[k] = re_extract(res, v)
logger.debug(f"\n======================================================\n" \
"-------------End从响应数据中提取后置参数保存到全局变量--------------------\n"
f"后置提取参数(新): {result}\n" \
"=====================================================")
# 将提取到的变量保存在全局变量中
if result:
for k, v in result.items():
GLOBAL_VARS[k] = v
return result
def response_type(response: Response) -> str: