def __run_step_testcase(self, step): """run teststep: referenced testcase""" step_data = StepData(name=step.name) step_variables = step.variables if hasattr(step.testcase, "config") and hasattr( step.testcase, "teststeps"): testcase_cls = step.testcase case_result = (testcase_cls().with_session( self.__session).with_case_id( self.__case_id).with_variables(step_variables).run()) elif isinstance(step.testcase, Text): if os.path.isabs(step.testcase): ref_testcase_path = step.testcase else: ref_testcase_path = os.path.join(self.__project_meta.PWD, step.testcase) case_result = (HttpRunner().with_session( self.__session).with_case_id(self.__case_id).with_variables( step_variables).run_path(ref_testcase_path)) else: raise exceptions.ParamsError( f"Invalid teststep referenced testcase: {step.dict()}") step_data.data = case_result.get_step_datas() # list of step data step_data.export = case_result.get_export_variables() step_data.success = case_result.success self.success &= case_result.success return step_data
def __run_step_testcase(self, step): """run teststep: referenced testcase""" step_data = StepData(name=step.name) step_variables = step.variables ref_testcase_path = os.path.join(self.__project_meta.PWD, step.testcase) case_result = (HttpRunner().with_session( self.__session).with_variables(step_variables).run_path( ref_testcase_path)) step_data.data = case_result.get_step_datas() # list of step data step_data.export = case_result.get_export_variables() step_data.success = case_result.success self.success &= case_result.success return step_data
def __run_step_request(self, step: TStep): """run teststep: request""" step_data = StepData(name=step.name) # parse prepare_upload_step(step, self.__project_meta.functions) request_dict = step.request.dict() request_dict.pop("upload", None) parsed_request_dict = parse_data(request_dict, step.variables, self.__project_meta.functions) # prepare arguments method = parsed_request_dict.pop("method") url_path = parsed_request_dict.pop("url") url = build_url(self.config.base_url, url_path) parsed_request_dict["json"] = parsed_request_dict.pop("req_json", {}) logger.info(f"{method} {url}") logger.debug(f"request kwargs(raw): {parsed_request_dict}") # request self.__session = self.__session or HttpSession() resp = self.__session.request(method, url, **parsed_request_dict) resp_obj = ResponseObject(resp) def log_req_resp_details(): err_msg = "\n{} DETAILED REQUEST & RESPONSE {}\n".format( "*" * 32, "*" * 32) # log request err_msg += "====== request details ======\n" err_msg += f"url: {url}\n" err_msg += f"method: {method}\n" headers = parsed_request_dict.pop("headers", {}) err_msg += f"headers: {headers}\n" for k, v in parsed_request_dict.items(): v = utils.omit_long_data(v) err_msg += f"{k}: {repr(v)}\n" err_msg += "\n" # log response err_msg += "====== response details ======\n" err_msg += f"status_code: {resp.status_code}\n" err_msg += f"headers: {resp.headers}\n" err_msg += f"body: {repr(resp.text)}\n" logger.error(err_msg) # extract extractors = step.extract extract_mapping = resp_obj.extract(extractors) step_data.export = extract_mapping variables_mapping = step.variables variables_mapping.update(extract_mapping) # validate validators = step.validators try: resp_obj.validate(validators, variables_mapping, self.__project_meta.functions) self.__session.data.success = True except ValidationFailure: self.__session.data.success = False log_req_resp_details() raise finally: # save request & response meta data self.__session.data.validators = resp_obj.validation_results self.success &= self.__session.data.success # save step data step_data.success = self.__session.data.success step_data.data = self.__session.data return step_data