Merge pull request #679 from chenhuahuan/master

feat: support jsonpath to parse json response
This commit is contained in:
debugtalk
2019-09-19 00:36:30 +08:00
committed by GitHub
2 changed files with 35 additions and 1 deletions

View File

@@ -2,10 +2,12 @@
import json import json
import re import re
import jsonpath
from httprunner import exceptions, logger, utils from httprunner import exceptions, logger, utils
from httprunner.compat import OrderedDict, basestring, is_py2 from httprunner.compat import OrderedDict, basestring, is_py2
text_extractor_regexp_compile = re.compile(r".*\(.*\).*") text_extractor_regexp_compile = re.compile(r".*\(.*\).*")
@@ -36,6 +38,35 @@ class ResponseObject(object):
logger.log_error(err_msg) logger.log_error(err_msg)
raise exceptions.ParamsError(err_msg) raise exceptions.ParamsError(err_msg)
def _extract_field_with_jsonpath(self, field):
"""
JSONPath Docs: https://goessner.net/articles/JsonPath/
For example, response body like below:
{
"code": 200,
"data": {
"items": [{
"id": 1,
"name": "Bob"
},
{
"id": 2,
"name": "James"
}
]
},
"message": "操作成功"
}
:param field: Jsonpath expression, e.g. 1)$.code 2) $..items.*.id
:return: A list that extracted from json repsonse example. 1) [200] 2) [1, 2]
"""
result = jsonpath.jsonpath(self.parsed_body(), field)
if result:
return result
else:
raise exceptions.ExtractFailure("\tjsonpath {} get nothing\n".format(field))
def _extract_field_with_regex(self, field): def _extract_field_with_regex(self, field):
""" extract field from response content with regex. """ extract field from response content with regex.
requests.Response body could be json or html text. requests.Response body could be json or html text.
@@ -209,7 +240,9 @@ class ResponseObject(object):
msg = "extract: {}".format(field) msg = "extract: {}".format(field)
if text_extractor_regexp_compile.match(field): if field.startswith("$"):
value = self._extract_field_with_jsonpath(field)
elif text_extractor_regexp_compile.match(field):
value = self._extract_field_with_regex(field) value = self._extract_field_with_regex(field)
else: else:
value = self._extract_field_with_delimiter(field) value = self._extract_field_with_delimiter(field)

View File

@@ -30,6 +30,7 @@ colorama = "^0.4.1"
colorlog = "^4.0" colorlog = "^4.0"
filetype = "^1.0" filetype = "^1.0"
future = { version = "^0.17.1", python = "~2.7" } future = { version = "^0.17.1", python = "~2.7" }
jsonpath = "^0.82"
[tool.poetry.dev-dependencies] [tool.poetry.dev-dependencies]
flask = "<1.0.0" flask = "<1.0.0"