From 1c8d38a2c8d58c24105ffba0d355122490eada82 Mon Sep 17 00:00:00 2001 From: debugtalk Date: Sat, 21 Jul 2018 12:47:39 +0800 Subject: [PATCH] bugfix: stringfy data before generating report --- httprunner/__about__.py | 2 +- httprunner/client.py | 5 +- httprunner/report.py | 55 ++++++++++--------- .../templates/default_report_template.html | 2 +- 4 files changed, 35 insertions(+), 29 deletions(-) diff --git a/httprunner/__about__.py b/httprunner/__about__.py index fc9fa35f..995d5ee3 100644 --- a/httprunner/__about__.py +++ b/httprunner/__about__.py @@ -1,7 +1,7 @@ __title__ = 'HttpRunner' __description__ = 'One-stop solution for HTTP(S) testing.' __url__ = 'https://github.com/HttpRunner/HttpRunner' -__version__ = '1.5.4' +__version__ = '1.5.5' __author__ = 'debugtalk' __author_email__ = 'mail@debugtalk.com' __license__ = 'MIT' diff --git a/httprunner/client.py b/httprunner/client.py index 187daf30..9b2ecfd5 100644 --- a/httprunner/client.py +++ b/httprunner/client.py @@ -67,7 +67,9 @@ class HttpSession(requests.Session): "content_size": "N/A", "response_time_ms": "N/A", "elapsed_ms": "N/A", - "content": None + "encoding": None, + "content": None, + "content_type": "" } } @@ -151,6 +153,7 @@ class HttpSession(requests.Session): self.meta_data["response"]["encoding"] = response.encoding self.meta_data["response"]["content"] = response.content self.meta_data["response"]["text"] = response.text + self.meta_data["response"]["content_type"] = response.headers.get("Content-Type", "") try: self.meta_data["response"]["json"] = response.json() diff --git a/httprunner/report.py b/httprunner/report.py index 7141bffe..7cb6b172 100644 --- a/httprunner/report.py +++ b/httprunner/report.py @@ -93,8 +93,8 @@ def render_html_report(summary, html_report_name=None, html_report_template=None for suite_summary in summary["details"]: for record in suite_summary.get("records"): meta_data = record['meta_data'] - stringify_body(meta_data, 'request') - stringify_body(meta_data, 'response') + stringify_data(meta_data, 'request') + stringify_data(meta_data, 'response') with io.open(html_report_template, "r", encoding='utf-8') as fp_r: template_content = fp_r.read() @@ -107,36 +107,39 @@ def render_html_report(summary, html_report_name=None, html_report_template=None return report_path -def stringify_body(meta_data, request_or_response): - headers = meta_data.get('{}_headers'.format(request_or_response), {}) - body = meta_data.get('{}_body'.format(request_or_response)) +def stringify_data(meta_data, request_or_response): + headers = meta_data[request_or_response]["headers"] - if isinstance(body, CaseInsensitiveDict): - body = json.dumps(dict(body), ensure_ascii=False) + request_or_response_dict = meta_data[request_or_response] - elif isinstance(body, (dict, list)): - body = json.dumps(body, indent=2, ensure_ascii=False) + for key, value in request_or_response_dict.items(): - elif isinstance(body, bytes): - resp_content_type = headers.get("Content-Type", "") - try: - if "image" in resp_content_type: - meta_data["response"]["data_type"] = "image" - body = "data:{};base64,{}".format( - resp_content_type, - b64encode(body).decode('utf-8') - ) - else: - body = escape(body.decode("utf-8")) - except UnicodeDecodeError: - pass + if isinstance(value, list): + value = json.dumps(value, indent=2, ensure_ascii=False) - elif not isinstance(body, (basestring, numeric_types, Iterable)): - # class instance, e.g. MultipartEncoder() - body = repr(body) + elif isinstance(value, bytes): + try: + encoding = meta_data["response"].get("encoding") + if not encoding or encoding == "None": + encoding = "utf-8" - meta_data['{}_body'.format(request_or_response)] = body + content_type = meta_data["response"]["content_type"] + if "image" in content_type: + meta_data["response"]["content_type"] = "image" + value = "data:{};base64,{}".format( + content_type, + b64encode(value).decode(encoding) + ) + else: + value = escape(value.decode(encoding)) + except UnicodeDecodeError: + pass + elif not isinstance(value, (basestring, numeric_types, Iterable)): + # class instance, e.g. MultipartEncoder() + value = repr(value) + + meta_data[request_or_response][key] = value class HtmlTestResult(unittest.TextTestResult): """A html result class that can generate formatted html results. diff --git a/httprunner/templates/default_report_template.html b/httprunner/templates/default_report_template.html index ec11a2b0..4c7b4441 100644 --- a/httprunner/templates/default_report_template.html +++ b/httprunner/templates/default_report_template.html @@ -281,7 +281,7 @@ {{ header_key }}: {{ header_value }} {% endfor %} - {% elif key == "data_type" %} + {% elif key == "content_type" %} {% if value == "image" %} {% else %}