From f3ca17febdc4480a074c1920bb46ab1c14720983 Mon Sep 17 00:00:00 2001 From: debugtalk Date: Mon, 11 May 2020 18:25:16 +0800 Subject: [PATCH] feat: run referenced testcase in v3 --- .../request_with_testcase_reference.yml | 13 +++++++ .../request_with_testcase_reference_test.py | 34 ++++++++++++++++ .../validate_with_variables_test.py | 2 +- httprunner/runner.py | 39 +++++++++++++++---- httprunner/schema.py | 3 +- 5 files changed, 82 insertions(+), 9 deletions(-) create mode 100644 examples/postman_echo/request_methods/request_with_testcase_reference.yml create mode 100644 examples/postman_echo/request_methods/request_with_testcase_reference_test.py diff --git a/examples/postman_echo/request_methods/request_with_testcase_reference.yml b/examples/postman_echo/request_methods/request_with_testcase_reference.yml new file mode 100644 index 00000000..7e139535 --- /dev/null +++ b/examples/postman_echo/request_methods/request_with_testcase_reference.yml @@ -0,0 +1,13 @@ +config: + name: "request methods testcase: reference testcase" + variables: + foo1: session_bar1 + base_url: "https://postman-echo.com" + verify: False + +teststeps: +- + name: request with variables + variables: + foo1: override_bar1 + testcase: request_methods/request_with_variables.yml diff --git a/examples/postman_echo/request_methods/request_with_testcase_reference_test.py b/examples/postman_echo/request_methods/request_with_testcase_reference_test.py new file mode 100644 index 00000000..f33a82b5 --- /dev/null +++ b/examples/postman_echo/request_methods/request_with_testcase_reference_test.py @@ -0,0 +1,34 @@ +from examples.postman_echo import debugtalk +from examples.postman_echo.request_methods.validate_with_variables_test \ + import TestCaseRequestMethodsValidateWithVariables +from httprunner.runner import TestCaseRunner +from httprunner.schema import TestsConfig, TestStep + + +class TestCaseRequestMethodsRefTestcase(TestCaseRunner): + config = TestsConfig(**{ + "name": "request methods testcase: reference testcase", + "variables": { + "foo1": "session_bar1" + }, + "functions": { + "get_httprunner_version": debugtalk.get_httprunner_version, + "sum_two": debugtalk.sum_two + }, + "base_url": "https://postman-echo.com", + "verify": False + }) + + teststeps = [ + TestStep(**{ + "name": "get with params", + "variables": { + "foo1": "override_bar1" + }, + "testcase": TestCaseRequestMethodsValidateWithVariables + }) + ] + + +if __name__ == '__main__': + TestCaseRequestMethodsRefTestcase().run() diff --git a/examples/postman_echo/request_methods/validate_with_variables_test.py b/examples/postman_echo/request_methods/validate_with_variables_test.py index 9252c239..6db6c6e0 100644 --- a/examples/postman_echo/request_methods/validate_with_variables_test.py +++ b/examples/postman_echo/request_methods/validate_with_variables_test.py @@ -96,4 +96,4 @@ class TestCaseRequestMethodsValidateWithVariables(TestCaseRunner): if __name__ == '__main__': runner = TestCaseRequestMethodsValidateWithVariables().run() - print(runner.case_datas) + print(runner.step_datas) diff --git a/httprunner/runner.py b/httprunner/runner.py index ffc2cab2..2cae578e 100644 --- a/httprunner/runner.py +++ b/httprunner/runner.py @@ -4,7 +4,7 @@ from loguru import logger from httprunner import utils from httprunner.client import HttpSession -from httprunner.exceptions import ValidationFailure +from httprunner.exceptions import ValidationFailure, ParamsError from httprunner.parser import build_url, parse_data, parse_variables_mapping from httprunner.response import ResponseObject from httprunner.schema import TestsConfig, TestStep, VariablesMapping, TestCase, SessionData @@ -17,6 +17,7 @@ class TestCaseRunner(object): session: HttpSession = None step_datas: List[SessionData] = [] validation_results: Dict = {} + session_variables: Dict = {} def init(self, testcase: TestCase) -> "TestCaseRunner": self.config = testcase.config @@ -31,9 +32,8 @@ class TestCaseRunner(object): self.config.variables.update(variables) return self - def __run_step(self, step: TestStep): - logger.info(f"run step: {step.name}") - + def __run_step_request(self, step: TestStep): + """run teststep: request""" # parse request_dict = step.request.dict() parsed_request_dict = parse_data(request_dict, step.variables, self.config.functions) @@ -100,24 +100,49 @@ class TestCaseRunner(object): return extract_mapping + def __run_step_testcase(self, step): + """run teststep: referenced testcase""" + step_variables = step.variables + testcase: TestCaseRunner = step.testcase + res = testcase.with_variables(**step_variables).run() + return res.get_export_variables() + + def __run_step(self, step: TestStep): + logger.info(f"run step: {step.name}") + if step.request: + return self.__run_step_request(step) + elif step.testcase: + return self.__run_step_testcase(step) + def test_start(self): """main entrance""" self.step_datas.clear() - session_variables = {} + self.session_variables.clear() for step in self.teststeps: # update with config variables step.variables.update(self.config.variables) # update with session variables extracted from former step - step.variables.update(session_variables) + step.variables.update(self.session_variables) # parse variables step.variables = parse_variables_mapping(step.variables, self.config.functions) # run step extract_mapping = self.__run_step(step) # save extracted variables to session variables - session_variables.update(extract_mapping) + self.session_variables.update(extract_mapping) return self def run(self): """main entrance alias for test_start""" return self.test_start() + + def get_export_variables(self): + export_vars_mapping = {} + for var_name in self.config.export: + if var_name not in self.session_variables: + raise ParamsError( + f"failed to export variable {var_name} from session variables {self.session_variables}") + + export_vars_mapping[var_name] = self.session_variables[var_name] + + return export_vars_mapping diff --git a/httprunner/schema.py b/httprunner/schema.py index 091d614a..8307f896 100644 --- a/httprunner/schema.py +++ b/httprunner/schema.py @@ -57,7 +57,8 @@ class Request(BaseModel): class TestStep(BaseModel): name: Name - request: Request + request: Request = None + testcase: Union[Text, Callable] = None variables: VariablesMapping = {} extract: Dict[Text, Text] = {} validators: Validators = Field([], alias="validate")