diff --git a/httprunner/client.py b/httprunner/client.py index 279c775c..60018e86 100644 --- a/httprunner/client.py +++ b/httprunner/client.py @@ -5,7 +5,7 @@ import time import requests import urllib3 from httprunner import logger -from httprunner.utils import build_url, lower_dict_keys, omit_long_data +from httprunner.utils import lower_dict_keys, omit_long_data from requests import Request, Response from requests.exceptions import (InvalidSchema, InvalidURL, MissingSchema, RequestException) @@ -28,15 +28,10 @@ class HttpSession(requests.Session): display statistics. This is a slightly extended version of `python-request `_'s - :py:class:`requests.Session` class and mostly this class works exactly the same. However - the methods for making requests (get, post, delete, put, head, options, patch, request) - can now take a *url* argument that's only the path part of the URL, in which case the host - part of the URL will be prepended with the HttpSession.base_url which is normally inherited - from a HttpRunner class' host property. + :py:class:`requests.Session` class and mostly this class works exactly the same. """ - def __init__(self, base_url=None, *args, **kwargs): + def __init__(self, *args, **kwargs): super(HttpSession, self).__init__(*args, **kwargs) - self.base_url = base_url if base_url else "" self.init_meta_data() def init_meta_data(self): @@ -180,9 +175,6 @@ class HttpSession(requests.Session): kwargs.setdefault("timeout", 120) self.meta_data["data"][0]["request"].update(kwargs) - # prepend url with hostname unless it's already an absolute URL - url = build_url(self.base_url, url) - start_timestamp = time.time() response = self._send_request_safe_mode(method, url, **kwargs) response_time_ms = round((time.time() - start_timestamp) * 1000, 2) diff --git a/httprunner/parser.py b/httprunner/parser.py index cc1db6aa..b6530895 100644 --- a/httprunner/parser.py +++ b/httprunner/parser.py @@ -795,8 +795,7 @@ def _extend_with_testcase(test_dict, testcase_def_dict): def __prepare_config(config, project_mapping): - """ parse testcase/testsuite config, - including everything (name and base_url) except variables. + """ parse testcase/testsuite config. """ # get config variables raw_config_variables = config.pop("variables", {}) diff --git a/httprunner/runner.py b/httprunner/runner.py index 25dfd13a..f0e7ad5e 100644 --- a/httprunner/runner.py +++ b/httprunner/runner.py @@ -60,7 +60,6 @@ class Runner(object): http_client_session (instance): requests.Session(), or locust.client.Session() instance. """ - base_url = config.get("base_url") self.verify = config.get("verify", True) self.output = config.get("output", []) self.validation_results = [] @@ -70,7 +69,7 @@ class Runner(object): # testcase teardown hooks self.testcase_teardown_hooks = config.get("teardown_hooks", []) - self.http_client_session = http_client_session or HttpSession(base_url) + self.http_client_session = http_client_session or HttpSession() self.session_context = SessionContext() if testcase_setup_hooks: @@ -212,21 +211,23 @@ class Runner(object): # teststep name test_name = self.session_context.eval_content(test_dict.get("name", "")) - # TODO: refactor - self.http_client_session.base_url = self.session_context.eval_content(test_dict.get("base_url", "")) # parse test request raw_request = test_dict.get('request', {}) parsed_test_request = self.session_context.eval_content(raw_request) self.session_context.update_test_variables("request", parsed_test_request) + # prepend url with base_url unless it's already an absolute URL + url = parsed_test_request.pop('url') + base_url = self.session_context.eval_content(test_dict.get("base_url", "")) + parsed_url = utils.build_url(base_url, url) + # setup hooks setup_hooks = test_dict.get("setup_hooks", []) if setup_hooks: self.do_hook_actions(setup_hooks, "setup") try: - url = parsed_test_request.pop('url') method = parsed_test_request.pop('method') parsed_test_request.setdefault("verify", self.verify) group_name = parsed_test_request.pop("group", None) @@ -241,13 +242,13 @@ class Runner(object): logger.log_error(err_msg) raise exceptions.ParamsError(err_msg) - logger.log_info("{method} {url}".format(method=method, url=url)) + logger.log_info("{method} {url}".format(method=method, url=parsed_url)) logger.log_debug("request kwargs(raw): {kwargs}".format(kwargs=parsed_test_request)) # request resp = self.http_client_session.request( method, - url, + parsed_url, name=(group_name or test_name), **parsed_test_request ) @@ -273,7 +274,7 @@ class Runner(object): # log request err_msg += "====== request details ======\n" - err_msg += "url: {}\n".format(url) + err_msg += "url: {}\n".format(parsed_url) err_msg += "method: {}\n".format(method) err_msg += "headers: {}\n".format(parsed_test_request.pop("headers", {})) for k, v in parsed_test_request.items(): diff --git a/httprunner/utils.py b/httprunner/utils.py index 7747715c..73da341c 100644 --- a/httprunner/utils.py +++ b/httprunner/utils.py @@ -53,7 +53,7 @@ def get_os_environ(variable_name): def build_url(base_url, path): - """ prepend url with hostname unless it's already an absolute URL """ + """ prepend url with base_url unless it's already an absolute URL """ if absolute_http_url_regexp.match(path): return path elif base_url: diff --git a/tests/test_client.py b/tests/test_client.py index ae593016..70d4d276 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -7,7 +7,7 @@ from tests.base import ApiServerUnittest class TestHttpClient(ApiServerUnittest): def setUp(self): super(TestHttpClient, self).setUp() - self.api_client = HttpSession(self.host) + self.api_client = HttpSession() self.headers = self.get_authenticated_headers() self.reset_all() @@ -30,7 +30,7 @@ class TestHttpClient(ApiServerUnittest): self.assertEqual(True, resp.json()['success']) def test_request_without_base_url(self): - url = "/api/users/1000" + url = "{}/api/users/1000".format(self.host) data = { 'name': 'user1', 'password': '123456' @@ -40,7 +40,7 @@ class TestHttpClient(ApiServerUnittest): self.assertEqual(True, resp.json()['success']) def test_request_post_data(self): - url = "/api/users/1000" + url = "{}/api/users/1000".format(self.host) data = { 'name': 'user1', 'password': '123456' @@ -56,7 +56,7 @@ class TestHttpClient(ApiServerUnittest): self.assertIn("password=123456", resp.request.body) def test_request_with_cookies(self): - url = "/api/users/1000" + url = "{}/api/users/1000".format(self.host) data = { 'name': 'user1', 'password': '123456'