mirror of
https://github.com/httprunner/httprunner.git
synced 2026-09-04 23:16:57 +08:00
relocate build url with base_url
This commit is contained in:
+3
-11
@@ -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)
|
||||||
|
|||||||
@@ -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", {})
|
||||||
|
|||||||
@@ -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
@@ -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:
|
||||||
|
|||||||
@@ -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'
|
||||||
|
|||||||
Reference in New Issue
Block a user