From 80cdcd331803daf3d9a925e8c641b000c73062fd Mon Sep 17 00:00:00 2001 From: debugtalk Date: Tue, 17 Dec 2019 21:00:10 +0800 Subject: [PATCH 1/6] bump version to 2.4.4 --- httprunner/__init__.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/httprunner/__init__.py b/httprunner/__init__.py index ecce350e..6628c0d6 100644 --- a/httprunner/__init__.py +++ b/httprunner/__init__.py @@ -1,4 +1,4 @@ -__version__ = "2.4.3" +__version__ = "2.4.4" __description__ = "One-stop solution for HTTP(S) testing." __all__ = ["__version__", "__description__"] diff --git a/pyproject.toml b/pyproject.toml index 07a071f9..d9603f96 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "httprunner" -version = "2.4.3" +version = "2.4.4" description = "One-stop solution for HTTP(S) testing." license = "Apache-2.0" readme = "README.md" From aa253338b6e217b22675b52057454d83618e0645 Mon Sep 17 00:00:00 2001 From: debugtalk Date: Tue, 17 Dec 2019 21:52:48 +0800 Subject: [PATCH 2/6] refactor: dumps request body if it is in json format, display indented json in html report --- docs/CHANGELOG.md | 3 ++- httprunner/report.py | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 492e365c..2763cbb4 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -4,7 +4,8 @@ **Changed** -- refactor: dumps request and response headers/body, display indented json in report +- refactor: dumps request/response headers, display indented json in html report +- refactor: dumps request/response body if it is in json format, display indented json in html report ## 2.4.3 (2019-12-16) diff --git a/httprunner/report.py b/httprunner/report.py index 82bebf3d..afd065e5 100644 --- a/httprunner/report.py +++ b/httprunner/report.py @@ -153,6 +153,12 @@ def __stringify_request(request_data): """ for key, value in request_data.items(): + if key == "body": + try: + value = json.loads(value) + except json.decoder.JSONDecodeError: + pass + if isinstance(value, (list, dict)): value = dumps_json(value) From 61790db984408d2068977af21b478684875692fb Mon Sep 17 00:00:00 2001 From: debugtalk Date: Tue, 17 Dec 2019 22:09:36 +0800 Subject: [PATCH 3/6] fix: unittest --- httprunner/report.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/httprunner/report.py b/httprunner/report.py index afd065e5..d0c603d1 100644 --- a/httprunner/report.py +++ b/httprunner/report.py @@ -11,7 +11,7 @@ from jinja2 import Template, escape from requests.cookies import RequestsCookieJar from httprunner import __version__, logger -from httprunner.compat import basestring, bytes, json, numeric_types +from httprunner.compat import basestring, bytes, json, numeric_types, JSONDecodeError def get_platform(): @@ -156,7 +156,7 @@ def __stringify_request(request_data): if key == "body": try: value = json.loads(value) - except json.decoder.JSONDecodeError: + except JSONDecodeError: pass if isinstance(value, (list, dict)): From 0e39517d278682ec70e344aee0650d4ea845186e Mon Sep 17 00:00:00 2001 From: debugtalk Date: Tue, 17 Dec 2019 22:35:22 +0800 Subject: [PATCH 4/6] feat: add keyword 'body' to reference response body change: unify response field(content/json/text) to 'body' in html report --- docs/CHANGELOG.md | 5 +++++ httprunner/client.py | 8 ++++---- httprunner/report.py | 2 +- httprunner/response.py | 2 +- httprunner/static/report_template.html | 8 ++++---- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 2763cbb4..3a7debdb 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,10 +2,15 @@ ## 2.4.4 (2019-12-17) +**Added** + +- feat: add keyword `body` to reference response body + **Changed** - refactor: dumps request/response headers, display indented json in html report - refactor: dumps request/response body if it is in json format, display indented json in html report +- change: unify response field(content/json/text) to `body` in html report ## 2.4.3 (2019-12-16) diff --git a/httprunner/client.py b/httprunner/client.py index 0a2af89e..1b5676e1 100644 --- a/httprunner/client.py +++ b/httprunner/client.py @@ -111,18 +111,18 @@ class HttpSession(requests.Session): if "image" in content_type: # response is image type, record bytes content only - req_resp_dict["response"]["content"] = resp_obj.content + req_resp_dict["response"]["body"] = resp_obj.content else: try: # try to record json data if isinstance(resp_obj, response.ResponseObject): - req_resp_dict["response"]["json"] = resp_obj.json + req_resp_dict["response"]["body"] = resp_obj.json else: - req_resp_dict["response"]["json"] = resp_obj.json() + req_resp_dict["response"]["body"] = resp_obj.json() except ValueError: # only record at most 512 text charactors resp_text = resp_obj.text - req_resp_dict["response"]["text"] = omit_long_data(resp_text) + req_resp_dict["response"]["body"] = omit_long_data(resp_text) # log response details in debug mode log_print(req_resp_dict, "response") diff --git a/httprunner/report.py b/httprunner/report.py index d0c603d1..37decadf 100644 --- a/httprunner/report.py +++ b/httprunner/report.py @@ -217,7 +217,7 @@ def __stringify_response(response_data): if not encoding or encoding == "None": encoding = "utf-8" - if key == "content" and "image" in response_data["content_type"]: + if key == "body" and "image" in response_data["content_type"]: # display image value = "data:{};base64,{}".format( response_data["content_type"], diff --git a/httprunner/response.py b/httprunner/response.py index b6062e63..9de3a8cd 100644 --- a/httprunner/response.py +++ b/httprunner/response.py @@ -175,7 +175,7 @@ class ResponseObject(object): raise exceptions.ExtractFailure(err_msg) # response body - elif top_query in ["content", "text", "json"]: + elif top_query in ["body", "content", "text", "json"]: try: body = self.json except exceptions.JSONDecodeError: diff --git a/httprunner/static/report_template.html b/httprunner/static/report_template.html index f943172a..cef1ed19 100644 --- a/httprunner/static/report_template.html +++ b/httprunner/static/report_template.html @@ -250,14 +250,14 @@ {{key}} - {% if key == "content" %} + {% if key == "headers" %} +
{{ value | e }}
+ {% elif key == "body" %} {% if "image" in req_resp.response.content_type %} {% else %} - {{ value }} - {% endif %} - {% elif key in ["headers", "text", "json"] %}
{{ value | e }}
+ {% endif %} {% else %} {{ value }} {% endif %} From dfee152e2643c6dc1d9de140084e13786a9eac6b Mon Sep 17 00:00:00 2001 From: debugtalk Date: Tue, 17 Dec 2019 22:39:48 +0800 Subject: [PATCH 5/6] fix: unittest --- tests/test_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_api.py b/tests/test_api.py index e8711ecd..1ce8884c 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -268,7 +268,7 @@ class TestHttpRunner(ApiServerUnittest): self.assertTrue(summary["success"]) self.assertEqual(summary["stat"]["testcases"]["total"], 1) self.assertEqual(summary["stat"]["teststeps"]["total"], 1) - resp_json = json.loads(summary["details"][0]["records"][0]["meta_datas"]["data"][0]["response"]["json"]) + resp_json = json.loads(summary["details"][0]["records"][0]["meta_datas"]["data"][0]["response"]["body"]) self.assertEqual( resp_json["data"], "abc" From ea86ddfd022f09779d2f8656b1f91dd64c533c09 Mon Sep 17 00:00:00 2001 From: debugtalk Date: Tue, 17 Dec 2019 23:04:39 +0800 Subject: [PATCH 6/6] fix: unittest for python <3.6 --- httprunner/report.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/httprunner/report.py b/httprunner/report.py index 37decadf..cc8e38c6 100644 --- a/httprunner/report.py +++ b/httprunner/report.py @@ -153,12 +153,6 @@ def __stringify_request(request_data): """ for key, value in request_data.items(): - if key == "body": - try: - value = json.loads(value) - except JSONDecodeError: - pass - if isinstance(value, (list, dict)): value = dumps_json(value) @@ -169,6 +163,13 @@ def __stringify_request(request_data): except UnicodeDecodeError: pass + if key == "body": + try: + # request body is in json format + value = json.loads(value) + except JSONDecodeError: + pass + elif not isinstance(value, (basestring, numeric_types, Iterable)): # class instance, e.g. MultipartEncoder() value = repr(value)