change: print error log when failed to search with jmespath

This commit is contained in:
debugtalk
2020-06-30 15:48:42 +08:00
parent d44fd98328
commit fb8bf6c7b6

View File

@@ -2,12 +2,13 @@ from typing import Dict, Text, Any, NoReturn
import jmespath import jmespath
import requests import requests
from jmespath.exceptions import JMESPathError
from loguru import logger from loguru import logger
from httprunner import exceptions from httprunner import exceptions
from httprunner.exceptions import ValidationFailure, ParamsError from httprunner.exceptions import ValidationFailure, ParamsError
from httprunner.parser import parse_data, parse_string_value, get_mapping_function
from httprunner.models import VariablesMapping, Validators, FunctionsMapping from httprunner.models import VariablesMapping, Validators, FunctionsMapping
from httprunner.parser import parse_data, parse_string_value, get_mapping_function
def get_uniform_comparator(comparator: Text): def get_uniform_comparator(comparator: Text):
@@ -143,14 +144,25 @@ class ResponseObject(object):
self.__dict__[key] = value self.__dict__[key] = value
return value return value
@property def _search_jmespath(self, expr: Text) -> Any:
def resp_obj_meta(self): resp_obj_meta = {
return {
"status_code": self.status_code, "status_code": self.status_code,
"headers": self.headers, "headers": self.headers,
"cookies": self.cookies, "cookies": self.cookies,
"body": self.body, "body": self.body,
} }
try:
check_value = jmespath.search(expr, resp_obj_meta)
except JMESPathError as ex:
logger.error(
f"failed to search with jmespath\n"
f"expression: {expr}\n"
f"data: {resp_obj_meta}\n"
f"exception: {ex}"
)
raise
return check_value
def extract(self, extractors: Dict[Text, Text]) -> Dict[Text, Any]: def extract(self, extractors: Dict[Text, Text]) -> Dict[Text, Any]:
if not extractors: if not extractors:
@@ -158,7 +170,7 @@ class ResponseObject(object):
extract_mapping = {} extract_mapping = {}
for key, field in extractors.items(): for key, field in extractors.items():
field_value = jmespath.search(field, self.resp_obj_meta) field_value = self._search_jmespath(field)
extract_mapping[key] = field_value extract_mapping[key] = field_value
logger.info(f"extract mapping: {extract_mapping}") logger.info(f"extract mapping: {extract_mapping}")
@@ -198,7 +210,7 @@ class ResponseObject(object):
check_item = parse_string_value(check_item) check_item = parse_string_value(check_item)
if check_item and isinstance(check_item, Text): if check_item and isinstance(check_item, Text):
check_value = jmespath.search(check_item, self.resp_obj_meta) check_value = self._search_jmespath(check_item)
else: else:
# variable or function evaluation result is "" or not text # variable or function evaluation result is "" or not text
check_value = check_item check_value = check_item