relocate build url with base_url

This commit is contained in:
debugtalk
2019-04-08 14:11:49 +08:00
parent 3d1c7f368c
commit 4a478f55d0
5 changed files with 18 additions and 26 deletions
+3 -11
View File
@@ -5,7 +5,7 @@ import time
import requests import requests
import urllib3 import urllib3
from httprunner import logger 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 import Request, Response
from requests.exceptions import (InvalidSchema, InvalidURL, MissingSchema, from requests.exceptions import (InvalidSchema, InvalidURL, MissingSchema,
RequestException) RequestException)
@@ -28,15 +28,10 @@ class HttpSession(requests.Session):
display statistics. display statistics.
This is a slightly extended version of `python-request <http://python-requests.org>`_'s This is a slightly extended version of `python-request <http://python-requests.org>`_'s
:py:class:`requests.Session` class and mostly this class works exactly the same. However :py:class:`requests.Session` class and mostly this class works exactly the same.
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.
""" """
def __init__(self, base_url=None, *args, **kwargs): def __init__(self, *args, **kwargs):
super(HttpSession, self).__init__(*args, **kwargs) super(HttpSession, self).__init__(*args, **kwargs)
self.base_url = base_url if base_url else ""
self.init_meta_data() self.init_meta_data()
def init_meta_data(self): def init_meta_data(self):
@@ -180,9 +175,6 @@ class HttpSession(requests.Session):
kwargs.setdefault("timeout", 120) kwargs.setdefault("timeout", 120)
self.meta_data["data"][0]["request"].update(kwargs) 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() start_timestamp = time.time()
response = self._send_request_safe_mode(method, url, **kwargs) response = self._send_request_safe_mode(method, url, **kwargs)
response_time_ms = round((time.time() - start_timestamp) * 1000, 2) response_time_ms = round((time.time() - start_timestamp) * 1000, 2)
+1 -2
View File
@@ -795,8 +795,7 @@ def _extend_with_testcase(test_dict, testcase_def_dict):
def __prepare_config(config, project_mapping): def __prepare_config(config, project_mapping):
""" parse testcase/testsuite config, """ parse testcase/testsuite config.
including everything (name and base_url) except variables.
""" """
# get config variables # get config variables
raw_config_variables = config.pop("variables", {}) raw_config_variables = config.pop("variables", {})
+9 -8
View File
@@ -60,7 +60,6 @@ class Runner(object):
http_client_session (instance): requests.Session(), or locust.client.Session() instance. http_client_session (instance): requests.Session(), or locust.client.Session() instance.
""" """
base_url = config.get("base_url")
self.verify = config.get("verify", True) self.verify = config.get("verify", True)
self.output = config.get("output", []) self.output = config.get("output", [])
self.validation_results = [] self.validation_results = []
@@ -70,7 +69,7 @@ class Runner(object):
# testcase teardown hooks # testcase teardown hooks
self.testcase_teardown_hooks = config.get("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() self.session_context = SessionContext()
if testcase_setup_hooks: if testcase_setup_hooks:
@@ -212,21 +211,23 @@ class Runner(object):
# teststep name # teststep name
test_name = self.session_context.eval_content(test_dict.get("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 # parse test request
raw_request = test_dict.get('request', {}) raw_request = test_dict.get('request', {})
parsed_test_request = self.session_context.eval_content(raw_request) parsed_test_request = self.session_context.eval_content(raw_request)
self.session_context.update_test_variables("request", parsed_test_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
setup_hooks = test_dict.get("setup_hooks", []) setup_hooks = test_dict.get("setup_hooks", [])
if setup_hooks: if setup_hooks:
self.do_hook_actions(setup_hooks, "setup") self.do_hook_actions(setup_hooks, "setup")
try: try:
url = parsed_test_request.pop('url')
method = parsed_test_request.pop('method') method = parsed_test_request.pop('method')
parsed_test_request.setdefault("verify", self.verify) parsed_test_request.setdefault("verify", self.verify)
group_name = parsed_test_request.pop("group", None) group_name = parsed_test_request.pop("group", None)
@@ -241,13 +242,13 @@ class Runner(object):
logger.log_error(err_msg) logger.log_error(err_msg)
raise exceptions.ParamsError(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)) logger.log_debug("request kwargs(raw): {kwargs}".format(kwargs=parsed_test_request))
# request # request
resp = self.http_client_session.request( resp = self.http_client_session.request(
method, method,
url, parsed_url,
name=(group_name or test_name), name=(group_name or test_name),
**parsed_test_request **parsed_test_request
) )
@@ -273,7 +274,7 @@ class Runner(object):
# log request # log request
err_msg += "====== request details ======\n" 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 += "method: {}\n".format(method)
err_msg += "headers: {}\n".format(parsed_test_request.pop("headers", {})) err_msg += "headers: {}\n".format(parsed_test_request.pop("headers", {}))
for k, v in parsed_test_request.items(): for k, v in parsed_test_request.items():
+1 -1
View File
@@ -53,7 +53,7 @@ def get_os_environ(variable_name):
def build_url(base_url, path): 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): if absolute_http_url_regexp.match(path):
return path return path
elif base_url: elif base_url:
+4 -4
View File
@@ -7,7 +7,7 @@ from tests.base import ApiServerUnittest
class TestHttpClient(ApiServerUnittest): class TestHttpClient(ApiServerUnittest):
def setUp(self): def setUp(self):
super(TestHttpClient, self).setUp() super(TestHttpClient, self).setUp()
self.api_client = HttpSession(self.host) self.api_client = HttpSession()
self.headers = self.get_authenticated_headers() self.headers = self.get_authenticated_headers()
self.reset_all() self.reset_all()
@@ -30,7 +30,7 @@ class TestHttpClient(ApiServerUnittest):
self.assertEqual(True, resp.json()['success']) self.assertEqual(True, resp.json()['success'])
def test_request_without_base_url(self): def test_request_without_base_url(self):
url = "/api/users/1000" url = "{}/api/users/1000".format(self.host)
data = { data = {
'name': 'user1', 'name': 'user1',
'password': '123456' 'password': '123456'
@@ -40,7 +40,7 @@ class TestHttpClient(ApiServerUnittest):
self.assertEqual(True, resp.json()['success']) self.assertEqual(True, resp.json()['success'])
def test_request_post_data(self): def test_request_post_data(self):
url = "/api/users/1000" url = "{}/api/users/1000".format(self.host)
data = { data = {
'name': 'user1', 'name': 'user1',
'password': '123456' 'password': '123456'
@@ -56,7 +56,7 @@ class TestHttpClient(ApiServerUnittest):
self.assertIn("password=123456", resp.request.body) self.assertIn("password=123456", resp.request.body)
def test_request_with_cookies(self): def test_request_with_cookies(self):
url = "/api/users/1000" url = "{}/api/users/1000".format(self.host)
data = { data = {
'name': 'user1', 'name': 'user1',
'password': '123456' 'password': '123456'