diff --git a/httprunner/events.py b/httprunner/events.py index b52928a2..39732e76 100644 --- a/httprunner/events.py +++ b/httprunner/events.py @@ -1,4 +1,6 @@ # encoding: utf-8 +from httprunner.exception import MyBaseError + class EventHook(object): """ @@ -14,17 +16,20 @@ class EventHook(object): """ def __init__(self): - self._handlers = set() + self._handlers = [] def __iadd__(self, handler): - self._handlers.add(handler) + self._handlers.append(handler) return self def __isub__(self, handler): - self._handlers.remove(handler) + if handler not in self._handlers: + raise MyBaseError("handler not found: {}".format(handler)) + + index = self._handlers.index(handler) + self._handlers.pop(index) return self def fire(self, **kwargs): for handler in self._handlers: handler(**kwargs) - diff --git a/tests/httpbin/debugtalk.py b/tests/httpbin/debugtalk.py new file mode 100644 index 00000000..02a5e207 --- /dev/null +++ b/tests/httpbin/debugtalk.py @@ -0,0 +1,6 @@ + +def setup_hook_add_kwargs(method, url, kwargs): + kwargs["key"] = "value" + +def setup_hook_remove_kwargs(method, url, kwargs): + kwargs.pop("key") diff --git a/tests/httpbin/hooks.yml b/tests/httpbin/hooks.yml new file mode 100644 index 00000000..bdb5a11a --- /dev/null +++ b/tests/httpbin/hooks.yml @@ -0,0 +1,16 @@ +- config: + name: basic test with httpbin + request: + base_url: https://httpbin.org/ + +- test: + name: headers + request: + url: /headers + method: GET + setup_hooks: + - setup_hook_add_kwargs + - setup_hook_remove_kwargs + validate: + - eq: ["status_code", 200] + - eq: [content.headers.Host, "httpbin.org"] diff --git a/tests/test_runner.py b/tests/test_runner.py index 77d1e482..f46a5816 100644 --- a/tests/test_runner.py +++ b/tests/test_runner.py @@ -75,6 +75,13 @@ class TestRunner(ApiServerUnittest): # check if teardown function executed self.assertGreater(end_time - start_time, 2) + def test_run_testset_with_setup_hooks(self): + testcase_file_path = os.path.join( + os.getcwd(), 'tests/httpbin/hooks.yml') + runner = HttpRunner().run(testcase_file_path) + summary = runner.summary + self.assertTrue(summary["success"]) + def test_run_testset_hardcode(self): for testcase_file_path in self.testcase_file_path_list: runner = HttpRunner().run(testcase_file_path)