diff --git a/ate/__init__.py b/ate/__init__.py index 3966a5f1..39cae215 100644 --- a/ate/__init__.py +++ b/ate/__init__.py @@ -1 +1 @@ -__version__ = '0.6.1' \ No newline at end of file +__version__ = '0.6.2' \ No newline at end of file diff --git a/ate/built_in.py b/ate/built_in.py index ffc1867d..cf272609 100644 --- a/ate/built_in.py +++ b/ate/built_in.py @@ -28,3 +28,8 @@ def get_current_date(fmt="%Y-%m-%d"): """ get current date, default format is %Y-%m-%d """ return datetime.datetime.now().strftime(fmt) + +def sleep(sec): + """ sleep specified seconds + """ + time.sleep(sec) diff --git a/ate/context.py b/ate/context.py index 49214898..071fa83c 100644 --- a/ate/context.py +++ b/ate/context.py @@ -138,7 +138,7 @@ class Context(object): ) def get_parsed_request(self): - """ get parsed request, with each variable replaced by bind value. + """ get parsed request, with bind variables and functions. """ parsed_request = self.testcase_parser.parse_content_with_bindings( self.testcase_request_config @@ -148,3 +148,8 @@ class Context(object): def get_testcase_variables_mapping(self): return self.testcase_variables_mapping + + def exec_content_functions(self, content): + """ execute functions in content. + """ + self.testcase_parser.eval_content_functions(content) diff --git a/ate/runner.py b/ate/runner.py index 9e8b7b6d..85948743 100644 --- a/ate/runner.py +++ b/ate/runner.py @@ -79,7 +79,9 @@ class Runner(object): "body": '{"name": "user", "password": "123456"}' }, "extract_binds": [], # optional - "validators": [] # optional + "validators": [], # optional + "setup": [], # optional + "teardown": [] # optional } @return True or raise exception during test """ @@ -95,8 +97,16 @@ class Runner(object): run_times = int(testcase.get("times", 1)) extract_binds = testcase.get("extract_binds", []) validators = testcase.get("validators", []) + setup_actions = testcase.get("setup", []) + teardown_actions = testcase.get("teardown", []) + + def setup_teardown(actions): + for action in actions: + self.context.exec_content_functions(action) for _ in range(run_times): + setup_teardown(setup_actions) + resp = self.http_client_session.request(url=url, method=method, **parsed_request) resp_obj = response.ResponseObject(resp) @@ -105,6 +115,8 @@ class Runner(object): resp_obj.validate(validators, self.context.get_testcase_variables_mapping()) + setup_teardown(teardown_actions) + return True def run_testset(self, testset): diff --git a/tests/test_context.py b/tests/test_context.py index 62b7565f..369d30c3 100644 --- a/tests/test_context.py +++ b/tests/test_context.py @@ -1,7 +1,8 @@ import os +import time import unittest -from ate import utils, runner +from ate import runner, utils from ate.context import Context from ate.exception import ParamsError @@ -229,3 +230,12 @@ class VariableBindsUnittest(unittest.TestCase): self.assertIn("data", parsed_request) self.assertEqual(parsed_request["data"], testcase["variable_binds"][2]["data"]) self.assertEqual(parsed_request["headers"]["secret_key"], "DebugTalk") + + def test_exec_content_functions(self): + test_runner = runner.Runner() + content = "${sleep(1)}" + start_time = time.time() + test_runner.context.exec_content_functions(content) + end_time = time.time() + elapsed_time = end_time - start_time + self.assertGreater(elapsed_time, 1)