From 9819a3247d07274895f31c7f582704f7fb0a9b13 Mon Sep 17 00:00:00 2001 From: debugtalk Date: Sun, 1 Jul 2018 22:52:25 +0800 Subject: [PATCH] fix #269: display the former url when the current testcase failed --- httprunner/__about__.py | 2 +- httprunner/client.py | 46 +++++++++++++++++++++++++---------------- httprunner/task.py | 4 +++- 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/httprunner/__about__.py b/httprunner/__about__.py index ae75cc5f..40f1461a 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.4.7' +__version__ = '1.4.8' __author__ = 'debugtalk' __author_email__ = 'mail@debugtalk.com' __license__ = 'MIT' diff --git a/httprunner/client.py b/httprunner/client.py index 33385a10..097fdd57 100644 --- a/httprunner/client.py +++ b/httprunner/client.py @@ -40,6 +40,7 @@ class HttpSession(requests.Session): def __init__(self, base_url=None, *args, **kwargs): super(HttpSession, self).__init__(*args, **kwargs) self.base_url = base_url if base_url else "" + self.init_meta_data() def _build_url(self, path): """ prepend url with hostname unless it's already an absolute URL """ @@ -50,6 +51,23 @@ class HttpSession(requests.Session): else: raise ParamsError("base url missed!") + def init_meta_data(self): + """ initialize meta_data, it will store detail data of request and response + """ + self.meta_data = { + "url": "N/A", + "method": "N/A", + "request_time": "N/A", + "request_headers": {}, + "request_body": "N/A", + "status_code": "N/A", + "response_headers": {}, + "response_body": "N/A", + "content_size": "N/A", + "response_time_ms": "N/A", + "elapsed_ms": "N/A" + } + def request(self, method, url, name=None, **kwargs): """ Constructs and sends a :py:class:`requests.Request`. @@ -89,43 +107,35 @@ class HttpSession(requests.Session): :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. """ - # store detail data of request and response - self.meta_data = { - "url": url, - "method": method, - "request_time": time.time(), - "request_headers": {}, - "request_body": "N/A", - "status_code": "N/A", - "response_headers": {}, - "response_body": "N/A", - "content_size": "N/A", - "response_time_ms": "N/A", - "elapsed_ms": "N/A" - } + # record original request info + self.meta_data["method"] = method + self.meta_data["url"] = url + self.meta_data["request_time"] = time.time() # prepend url with hostname unless it's already an absolute URL url = self._build_url(url) kwargs.setdefault("timeout", 120) response = self._send_request_safe_mode(method, url, **kwargs) + # record the consumed time self.meta_data["response_time_ms"] = round((time.time() - self.meta_data["request_time"]) * 1000, 2) self.meta_data["elapsed_ms"] = response.elapsed.microseconds / 1000.0 - self.meta_data["url"] = (response.history and response.history[0] or response)\ - .request.url - + # record actual request info + self.meta_data["url"] = (response.history and response.history[0] or response).request.url self.meta_data["request_headers"] = response.request.headers self.meta_data["request_body"] = response.request.body + + # record response info self.meta_data["status_code"] = response.status_code self.meta_data["response_headers"] = response.headers - try: self.meta_data["response_body"] = response.json() except ValueError: self.meta_data["response_body"] = response.content + # log response details in debug mode msg = "response details:\n" msg += "> status_code: {}\n".format(self.meta_data["status_code"]) msg += "> headers: {}\n".format(self.meta_data["response_headers"]) diff --git a/httprunner/task.py b/httprunner/task.py index fe9127f4..3448045c 100644 --- a/httprunner/task.py +++ b/httprunner/task.py @@ -25,7 +25,9 @@ class TestCase(unittest.TestCase): try: self.test_runner.run_test(self.testcase_dict) finally: - self.meta_data = getattr(self.test_runner.http_client_session, "meta_data", {}) + if hasattr(self.test_runner.http_client_session, "meta_data"): + self.meta_data = self.test_runner.http_client_session.meta_data + self.test_runner.http_client_session.init_meta_data() class TestSuite(unittest.TestSuite): """ create test suite with a testset, it may include one or several testcases.