兼容处理请求参数为空时去提取请求参数导致日志打印错误问题

This commit is contained in:
aaronchenyongzhi 2023-07-15 00:18:31 +08:00
parent 554261310c
commit 4b4eb0bfb6
9 changed files with 264 additions and 183 deletions

View File

@ -165,3 +165,35 @@ HTTPSConnectionPool(host='xxxx.com', port=443): Max retries exceeded with url: /
2023-07-14 23:00:30 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-07-14 23:00:33 | ERROR | 异常用例: safe_5_劳务基础配置_查询配置
HTTPSConnectionPool(host='xxxx.com', port=443): Max retries exceeded with url: /test/api/getTvInfo?t=1689346830060&projectId=3333 (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x000002D112A8BC70>: Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。'))
2023-07-14 23:31:50 | ERROR | key:<re.Match object; span=(152, 165), match='{{BSP_TOKEN}}'>,在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-07-14 23:31:51 | ERROR | key:<re.Match object; span=(138, 151), match='{{BSP_TOKEN}}'>,在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-07-14 23:31:51 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-07-14 23:33:01 | ERROR | key:<re.Match object; span=(152, 165), match='{{BSP_TOKEN}}'>,在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-07-14 23:33:13 | ERROR | key:<re.Match object; span=(138, 151), match='{{BSP_TOKEN}}'>,在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-07-14 23:33:13 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-07-14 23:38:02 | ERROR | key:<re.Match object; span=(152, 165), match='{{BSP_TOKEN}}'>,在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-07-14 23:38:15 | ERROR | key:<re.Match object; span=(138, 151), match='{{BSP_TOKEN}}'>,在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-07-14 23:38:15 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-07-14 23:45:41 | ERROR | key:<re.Match object; span=(152, 165), match='{{BSP_TOKEN}}'>,在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-07-14 23:45:51 | ERROR | key:<re.Match object; span=(138, 151), match='{{BSP_TOKEN}}'>,在关联参数表中查询不到,请检查关联参数字段提取及填写是否正常
2023-07-14 23:45:51 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-07-14 23:54:12 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-07-14 23:54:12 | ERROR | 提取失败提取表达式data.projectId没有提取到对应的值
2023-07-14 23:54:12 | ERROR | 异常用例: **safe_5_劳务基础配置_查询配置**
'FAIL' unexpectedly found in ('FAIL', [{'检查项': 'data.projectId', '期望值': '103654', '实际值': [], '断言方法': 'contained_by:实际值被包含在期望值中'}]) : FAIL 存在结果元组中
2023-07-14 23:56:41 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-07-14 23:56:41 | ERROR | 提取失败提取表达式data.projectId没有提取到对应的值
2023-07-14 23:56:41 | ERROR | 异常用例: **safe_5_劳务基础配置_查询配置**
'FAIL' unexpectedly found in ('FAIL', [{'检查项': 'data.projectId', '期望值': '103654', '实际值': [], '断言方法': 'contained_by:实际值被包含在期望值中'}]) : FAIL 存在结果元组中
2023-07-14 23:57:22 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-07-14 23:57:22 | ERROR | 提取失败提取表达式data.projectId没有提取到对应的值
2023-07-14 23:57:23 | ERROR | 异常用例: **safe_5_劳务基础配置_查询配置**
'FAIL' unexpectedly found in ('FAIL', [{'检查项': 'data.projectId', '期望值': '103654', '实际值': [], '断言方法': 'contained_by:实际值被包含在期望值中'}]) : FAIL 存在结果元组中

View File

@ -0,0 +1,9 @@
2023-07-15 00:01:21 | ERROR | 被提取对象非字典、非字符串、非列表不执行jsonpath提取被提取对象: None
2023-07-15 00:01:21 | ERROR | 提取失败提取表达式data.projectId没有提取到对应的值
2023-07-15 00:01:21 | ERROR | 异常用例: **safe_5_劳务基础配置_查询配置**
'FAIL' unexpectedly found in ('FAIL', [{'检查项': 'data.projectId', '期望值': '103654', '实际值': [], '断言方法': 'contained_by:实际值被包含在期望值中'}]) : FAIL 存在结果元组中
2023-07-15 00:07:51 | ERROR | | called clear_date | error: 快看,异常了,别唧唧哇哇,快排查!!: [Errno 13] Permission denied: 'E:\\apitest\\cases\\cases\\test_api.xlsx'
2023-07-15 00:07:52 | ERROR | | called write_back | error: 快看,异常了,别唧唧哇哇,快排查!!: [Errno 13] Permission denied: 'E:\\apitest\\cases\\cases\\test_api.xlsx'
2023-07-15 00:11:01 | ERROR | 提取失败提取表达式data.projectId没有提取到对应的值
2023-07-15 00:11:01 | ERROR | 异常用例: **safe_5_劳务基础配置_查询配置**
'FAIL' unexpectedly found in ('FAIL', [{'检查项': 'data.projectId', '期望值': '103654', '实际值': [], '断言方法': 'contained_by:实际值被包含在期望值中'}]) : FAIL 存在结果元组中

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@ -33,17 +33,17 @@ class Action(Extractor, LoadScript, Validator):
compiled = compile(ast_obj, '<string>', 'exec')
exec(compiled, {"pm": self})
except SyntaxError as e:
error_message = f'Syntax error in dynamic code: {e}'
error_message = f'动态代码语法异常: {e}'
self._handle_error(error_message)
except Exception as e:
error_message = f"Error executing dynamic code: {e}"
error_message = f"动态代码执行异常: {e}"
self._handle_error(error_message)
finally:
return self.__variables
return item
def _handle_error(self, error_message):
print(f'Error occurred: {error_message}')
print(f'发现异常: {error_message}')
def set_variables(self, item):
self.__variables = item
@ -59,5 +59,11 @@ class Action(Extractor, LoadScript, Validator):
# 请求头及body加密或者加签
headers, request_data = self.encrypt.encrypts(headers_crypto, headers, request_crypto, request_data)
# 提取请求参数信息
self.substitute_data(request_data, jp_dict=extract_request_data)
if extract_request_data is not None and request_data is not None:
self.substitute_data(request_data, jp_dict=extract_request_data)
return headers, request_data
def send_request(self, host, url, method, teardown_script, **kwargs):
response = self.http_client(host, url, method, **kwargs)
self.execute_dynamic_code(response, teardown_script)
return response

View File

@ -12,11 +12,10 @@ sys.path.append("./common")
from common.validation.load_modules_from_folder import LoadModulesFromFolder
from common.file_handling.file_utils import FileUtils
from common.utils.decorators import request_decorator
from common.utils.decorators import request_retry_on_exception
class Pyt(LoadModulesFromFolder):
# 类属性,保存一个会话对象,防止每次都创建一个新的会话,节省资源
session = requests.Session()
def __init__(self):
@ -24,7 +23,7 @@ class Pyt(LoadModulesFromFolder):
self.request = None
self.response = None
@request_decorator
@request_retry_on_exception()
def http_client(self, host, url, method, **kwargs):
"""
发送 http 请求

View File

@ -7,6 +7,7 @@
@time: 2023/3/21 17:41
@desc:
"""
import time
from functools import wraps
@ -27,21 +28,30 @@ def singleton(cls):
return get_instance
def request_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
try:
print(f"发送请求的参数: {kwargs}")
response = func(*args, **kwargs)
print(f"请求地址 --> {response.request.url}")
print(f"请求头 --> {response.request.headers}")
print(f"请求 body --> {response.request.body}")
print(f"接口状态--> {response.status_code}")
print(f"接口耗时--> {response.elapsed}")
print(f"接口响应--> {response.text}")
return response
except Exception as e:
print(f"接口异常--> {e}")
raise e
def request_retry_on_exception(retries=2, delay=1.5):
def request_decorator(func):
e = None
@wraps(func)
def wrapper(*args, **kwargs):
nonlocal e
for i in range(retries):
try:
print(f"{i}次发送请求的参数: {kwargs}")
response = func(*args, **kwargs)
print(f"请求地址 --> {response.request.url}")
print(f"请求头 --> {response.request.headers}")
print(f"请求 body --> {response.request.body}")
print(f"接口状态--> {response.status_code}")
print(f"接口耗时--> {response.elapsed}")
print(f"接口响应--> {response.text}")
except Exception as error:
e = error
time.sleep(delay)
else:
return response
raise Exception(f"请求重试**{retries}**次失败,请检查!!{e}")
return wrapper
return wrapper
return request_decorator

File diff suppressed because one or more lines are too long

View File

@ -62,16 +62,15 @@ class TestProjectApi(unittest.TestCase):
headers, request_data = self.action.analysis_request(request_data, h_crypto, headers, r_crypto, ex_request_data)
result_tuple = None
result = "PASS"
response = None
# 执行请求操作
kwargs = {request_data_type: request_data, 'headers': headers, "params": query_str}
# response = self.action.http_client(host, url, method, **kwargs)
# 执行后置代码片段
# self.action.execute_dynamic_code(response, teardown_script)
response = self.action.send_request(host, url, method, teardown_script, **kwargs)
try:
# 执行请求操作
kwargs = {request_data_type: request_data, 'headers': headers, "params": query_str}
response = self.action.http_client(host, url, method, **kwargs)
# 执行后置代码片段
self.action.execute_dynamic_code(response, teardown_script)
# 执行断言 返回结果元组
result_tuple = self.action.run_validate(expected, response.json())
self.assertNotIn("FAIL", result_tuple, "FAIL 存在结果元组中")