diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 981c1f59..b9441001 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,11 @@ # Release History -## 3.0.2 (2020-04-12) +## 3.0.2 (2020-04-17) + +**Added** + +- feat: implement global hooks `setup_testcase/teardown_testcase`, called before/after each testcase +- feat: implement global hooks `setup_teststep/teardown_teststep`, called before/after each teststep **Changed** @@ -9,6 +14,7 @@ - make `startproject` as hrun sub-command, usage: `hrun startproject ` - make `har2case` as hrun sub-command, usage: `hrun har2case -h` - make `locusts` as hrun sub-command, usage: `hrun locusts -h` +- remove default header `HRUN-Request-ID`, implement the same function with global hooks ## 3.0.1 (2020-03-24) diff --git a/httprunner/api.py b/httprunner/api.py index ec4e482d..1d4162d5 100644 --- a/httprunner/api.py +++ b/httprunner/api.py @@ -200,7 +200,6 @@ class HttpRunner(object): ) testcase_summary["log"] = logs_file_abs_path - testcase_summary["HRUN-Request-ID"] = testcase.runner.hrun_request_id summary["details"].append(testcase_summary) return summary diff --git a/httprunner/context.py b/httprunner/context.py index c08af242..e19aea5a 100644 --- a/httprunner/context.py +++ b/httprunner/context.py @@ -1,3 +1,5 @@ +import copy + from httprunner import parser, utils @@ -34,7 +36,7 @@ class SessionContext(object): } """ - variables_mapping = variables_mapping or {} + variables_mapping = copy.deepcopy(variables_mapping or {}) variables_mapping = utils.ensure_mapping_format(variables_mapping) variables_mapping.update(self.session_variables_mapping) parsed_variables_mapping = parser.parse_variables_mapping(variables_mapping) diff --git a/httprunner/parser.py b/httprunner/parser.py index b61e6adc..23372cbd 100644 --- a/httprunner/parser.py +++ b/httprunner/parser.py @@ -1076,8 +1076,17 @@ def __prepare_config(config, project_mapping, session_variables_set=None): if raw_config_variables_mapping: config["variables"] = raw_config_variables_mapping + if "setup_testcase" in functions: + config.setdefault("setup_hooks", []) + config["setup_hooks"].insert(0, "${setup_testcase($variables)}") + + if "teardown_testcase" in functions: + config.setdefault("teardown_hooks", []) + config["teardown_hooks"].append("${teardown_testcase()}") + check_variables_set = set(raw_config_variables_mapping.keys()) check_variables_set |= (session_variables_set or set()) + check_variables_set.add("variables") prepared_config = prepare_lazy_data(config, functions, check_variables_set, cached=True) return prepared_config @@ -1110,7 +1119,7 @@ def __prepare_testcase_tests(tests, config, project_mapping, session_variables_s session_variables_set = set(config_variables.keys()) | (session_variables_set or set()) for test_dict in tests: - teststep_variables_set = {"request", "response"} + teststep_variables_set = {"request", "response", "variables"} # 1, testcase config => testcase tests # override test_dict variables @@ -1120,6 +1129,14 @@ def __prepare_testcase_tests(tests, config, project_mapping, session_variables_s ) test_dict["variables"] = test_dict_variables + if "setup_teststep" in functions: + test_dict.setdefault("setup_hooks", []) + test_dict["setup_hooks"].insert(0, "${setup_teststep($request, $variables)}") + + if "teardown_teststep" in functions: + test_dict.setdefault("teardown_hooks", []) + test_dict["teardown_hooks"].append("${teardown_teststep($response)}") + # base_url & verify: priority test_dict > config if (not test_dict.get("base_url")) and config_base_url: test_dict["base_url"] = config_base_url diff --git a/httprunner/runner.py b/httprunner/runner.py index 71e2f723..9617db4c 100644 --- a/httprunner/runner.py +++ b/httprunner/runner.py @@ -1,4 +1,3 @@ -import uuid from enum import Enum from unittest.case import SkipTest @@ -72,12 +71,6 @@ class Runner(object): self.export = config.get("export") or config.get("output", []) config_variables = config.get("variables", {}) - self.hrun_request_id = str(uuid.uuid4()) - if "HRUN-Request-ID" not in config_variables: - config_variables["HRUN-Request-ID"] = self.hrun_request_id - else: - self.hrun_request_id = config_variables["HRUN-Request-ID"] - # testcase setup hooks testcase_setup_hooks = config.get("setup_hooks", []) # testcase teardown hooks @@ -86,6 +79,10 @@ class Runner(object): self.http_client_session = http_client_session or HttpSession() self.session_context = SessionContext(config_variables) + self.session_context.update_session_variables({ + "variables": config_variables + }) + if testcase_setup_hooks: self.do_hook_actions(testcase_setup_hooks, HookTypeEnum.SETUP) @@ -217,6 +214,9 @@ class Runner(object): parsed_test_request = self.session_context.eval_content(raw_request) self.session_context.update_test_variables("request", parsed_test_request) + test_variables.update(self.session_context.session_variables_mapping["variables"]) + self.session_context.update_test_variables("variables", test_variables) + # setup hooks setup_hooks = test_dict.get("setup_hooks", []) if setup_hooks: @@ -227,11 +227,6 @@ class Runner(object): base_url = self.session_context.eval_content(test_dict.get("base_url", "")) parsed_url = utils.build_url(base_url, url) - request_headers = parsed_test_request.setdefault("headers", {}) - if "HRUN-Request-ID" not in request_headers: - parsed_test_request["headers"]["HRUN-Request-ID"] = \ - self.session_context.session_variables_mapping["HRUN-Request-ID"] - try: method = parsed_test_request.pop('method') parsed_test_request.setdefault("verify", self.verify) diff --git a/tests/debugtalk.py b/tests/debugtalk.py index 101d6308..70681202 100644 --- a/tests/debugtalk.py +++ b/tests/debugtalk.py @@ -2,6 +2,9 @@ import os import random import string import time +import uuid + +from loguru import logger from tests.api_server import HTTPBIN_SERVER, gen_md5, get_sign @@ -25,6 +28,26 @@ def get_default_request(): } +def setup_testcase(variables): + logger.info(f"setup_testcase, variables: {variables}") + variables["request_id_prefix"] = str(int(time.time())) + + +def teardown_testcase(): + logger.info(f"teardown_testcase.") + + +def setup_teststep(request, variables): + logger.info(f"setup_teststep, request: {request}, variables: {variables}") + request.setdefault("headers", {}) + request_id_prefix = variables["request_id_prefix"] + request["headers"]["HRUN-Request-ID"] = request_id_prefix + "-" + str(uuid.uuid4()) + + +def teardown_teststep(response): + logger.info(f"teardown_teststep, response status code: {response.status_code}") + + def sum_two(m, n): return m + n diff --git a/tests/httpbin/hooks.yml b/tests/httpbin/hooks.yml index 280803ce..30078928 100644 --- a/tests/httpbin/hooks.yml +++ b/tests/httpbin/hooks.yml @@ -9,6 +9,8 @@ config: teststeps: - name: headers + variables: + a: 123 request: url: /headers method: GET