def convert_mappinglist_to_orderdict(mapping_list): """ convert mapping list to ordered dict Args: mapping_list (list): [ {"a": 1}, {"b": 2} ] Returns: OrderedDict: converted mapping in OrderedDict OrderDict( { "a": 1, "b": 2 } ) """ ordered_dict = OrderedDict() for map_dict in mapping_list: ordered_dict.update(map_dict) return ordered_dict
def _merge_extractor(def_extrators, ref_extractors): """ merge def_extrators with ref_extractors Args: def_extrators (list): [{"var1": "val1"}, {"var2": "val2"}] ref_extractors (list): [{"var1": "val111"}, {"var3": "val3"}] Returns: list: merged extractors Examples: >>> def_extrators = [{"var1": "val1"}, {"var2": "val2"}] >>> ref_extractors = [{"var1": "val111"}, {"var3": "val3"}] >>> _merge_extractor(def_extrators, ref_extractors) [ {"var1": "val111"}, {"var2": "val2"}, {"var3": "val3"} ] """ if not def_extrators: return ref_extractors elif not ref_extractors: return def_extrators else: extractor_dict = OrderedDict() for api_extrator in def_extrators: if len(api_extrator) != 1: logger.log_warning( "incorrect extractor: {}".format(api_extrator)) continue var_name = list(api_extrator.keys())[0] extractor_dict[var_name] = api_extrator[var_name] for test_extrator in ref_extractors: if len(test_extrator) != 1: logger.log_warning( "incorrect extractor: {}".format(test_extrator)) continue var_name = list(test_extrator.keys())[0] extractor_dict[var_name] = test_extrator[var_name] extractor_list = [] for key, value in extractor_dict.items(): extractor_list.append({key: value}) return extractor_list
def __init__(self, variables=None, functions=None): """ init Context with testcase variables and functions. """ # testcase level context ## TESTCASE_SHARED_VARIABLES_MAPPING and TESTCASE_SHARED_FUNCTIONS_MAPPING will not change. self.TESTCASE_SHARED_VARIABLES_MAPPING = variables or OrderedDict() self.TESTCASE_SHARED_FUNCTIONS_MAPPING = functions or OrderedDict() # testcase level request, will not change self.TESTCASE_SHARED_REQUEST_MAPPING = {} self.evaluated_validators = [] self.init_context_variables(level="testcase")
def extract_response(self, extractors): """ extract value from requests.Response and store in OrderedDict. Args: extractors (list): [ {"resp_status_code": "status_code"}, {"resp_headers_content_type": "headers.content-type"}, {"resp_content": "content"}, {"resp_content_person_first_name": "content.person.name.first_name"} ] Returns: OrderDict: variable binds ordered dict """ if not extractors: return {} logger.log_debug("start to extract from response object.") extracted_variables_mapping = OrderedDict() extract_binds_order_dict = utils.ensure_mapping_format(extractors) for key, field in extract_binds_order_dict.items(): extracted_variables_mapping[key] = self.extract_field(field) return extracted_variables_mapping
def extract_response(self, extractors): """ extract value from requests.Response and store in OrderedDict. @param (list) extractors [ {"resp_status_code": "status_code"}, {"resp_headers_content_type": "headers.content-type"}, {"resp_content": "content"}, {"resp_content_person_first_name": "content.person.name.first_name"} ] @return (OrderDict) variable binds ordered dict """ if not extractors: return {} logger.log_info("start to extract from response object.") extracted_variables_mapping = OrderedDict() extract_binds_order_dict = utils.convert_to_order_dict(extractors) for key, field in extract_binds_order_dict.items(): if not isinstance(field, basestring): raise exception.ParamsError("invalid extractors in testcase!") result = self.extract_field(field) extracted_variables_mapping[key] = result if not (isinstance(result, bool) or bool(result)): # False 可以return err_msg = u"extract data with delimiter can be None!\n" err_msg += u"response: {}\n".format(self.parsed_dict()) err_msg += u"regex: {}\n".format(field) logger.log_error(err_msg) raise exception.ParamsError(err_msg) return extracted_variables_mapping
def test_override_variables_binds(self): map_list = [ {"a": 1}, {"b": 2} ] override_mapping = {"a": 3, "c": 4} new_dict = utils.override_mapping_list(map_list, override_mapping) self.assertEqual(3, new_dict["a"]) self.assertEqual(4, new_dict["c"]) map_list = OrderedDict( { "a": 1, "b": 2 } ) override_mapping = {"a": 3, "c": 4} new_dict = utils.override_mapping_list(map_list, override_mapping) self.assertEqual(3, new_dict["a"]) self.assertEqual(4, new_dict["c"]) map_list = "invalid" override_mapping = {"a": 3, "c": 4} with self.assertRaises(exceptions.ParamsError): utils.override_mapping_list(map_list, override_mapping)
def config_context(self, config_dict, level): if level == "testset": self.testcase_parser.file_path = config_dict.get("path", None) variables = config_dict.get('variables') \ or config_dict.get('variable_binds', OrderedDict()) self.bind_variables(variables, level)
def init_context(self, level='testset'): """ testset level context initializes when a file is loaded, testcase level context initializes when each testcase starts. """ if level == "testset": self.testset_functions_config = {} self.testset_request_config = {} self.testset_shared_variables_mapping = OrderedDict() # testcase config shall inherit from testset configs, # but can not change testset configs, that's why we use copy.deepcopy here. self.testcase_functions_config = copy.deepcopy( self.testset_functions_config) self.testcase_variables_mapping = copy.deepcopy( self.testset_shared_variables_mapping) self.testcase_parser.bind_functions(self.testcase_functions_config) self.testcase_parser.update_binded_variables( self.testcase_variables_mapping) if level == "testset": #zhengchun, 20180608 # self.import_module_items(["httprunner.built_in"], "testset") pass
def extract_response(self, extractors): """ extract value from requests.Response and store in OrderedDict. @param (list) extractors [ {"resp_status_code": "status_code"}, {"resp_headers_content_type": "headers.content-type"}, {"resp_content": "content"}, {"resp_content_person_first_name": "content.person.name.first_name"} ] @return (OrderDict) variable binds ordered dict """ if not extractors: return {} logger.log_info("start to extract from response object.") extracted_variables_mapping = OrderedDict() extract_binds_order_dict = utils.convert_to_order_dict(extractors) for key, field in extract_binds_order_dict.items(): if not isinstance(field, basestring): raise exception.ParamsError("invalid extractors in testcase!") extracted_variables_mapping[key] = self.extract_field(field) return extracted_variables_mapping
def convert_to_order_dict(map_list): """ convert mapping in list to ordered dict @param (list) map_list [ {"a": 1}, {"b": 2} ] @return (OrderDict) OrderDict({ "a": 1, "b": 2 }) """ ordered_dict = OrderedDict() for map_dict in map_list: ordered_dict.update(map_dict) return ordered_dict
def __init__(self, variables=None, functions=None): """ init Context with testcase variables and functions. """ # testcase level context ## TESTCASE_SHARED_VARIABLES_MAPPING and TESTCASE_SHARED_FUNCTIONS_MAPPING are unchangeable. if isinstance(variables, list): self.TESTCASE_SHARED_VARIABLES_MAPPING = utils.convert_mappinglist_to_orderdict(variables) else: # dict self.TESTCASE_SHARED_VARIABLES_MAPPING = variables or OrderedDict() self.TESTCASE_SHARED_FUNCTIONS_MAPPING = functions or OrderedDict() # testcase level request, will not change self.TESTCASE_SHARED_REQUEST_MAPPING = {} self.evaluated_validators = [] self.init_context_variables(level="testcase")
def _merge_extractor(def_extrators, current_extractors): """ merge def_extrators with current_extractors @params: def_extrators: [{"var1": "val1"}, {"var2": "val2"}] current_extractors: [{"var1": "val111"}, {"var3": "val3"}] @return: [ {"var1": "val111"}, {"var2": "val2"}, {"var3": "val3"} ] """ if not def_extrators: return current_extractors elif not current_extractors: return def_extrators else: extractor_dict = OrderedDict() for api_extrator in def_extrators: if len(api_extrator) != 1: logger.log_warning( "incorrect extractor: {}".format(api_extrator)) continue var_name = list(api_extrator.keys())[0] extractor_dict[var_name] = api_extrator[var_name] for test_extrator in current_extractors: if len(test_extrator) != 1: logger.log_warning( "incorrect extractor: {}".format(test_extrator)) continue var_name = list(test_extrator.keys())[0] extractor_dict[var_name] = test_extrator[var_name] extractor_list = [] for key, value in extractor_dict.items(): extractor_list.append({key: value}) return extractor_list
def init_config(self, config_dict, level): """ create/update context variables binds Args: config_dict (dict): level (enum): "testcase" or "teststep" testcase: { "name": "testcase description", "variables": [], # optional "request": { "base_url": "http://127.0.0.1:5000", "headers": { "User-Agent": "iOS/2.8.3" } } } teststep: { "name": "teststep description", "variables": [], # optional "request": { "url": "/api/get-token", "method": "POST", "headers": { "Content-Type": "application/json" } }, "json": { "sign": "f1219719911caae89ccc301679857ebfda115ca2" } } Returns: dict: parsed request dict """ # convert keys in request headers to lowercase config_dict = utils.lower_config_dict_key(config_dict) self.context.init_context_variables(level) variables = config_dict.get('variables') \ or config_dict.get('variable_binds', OrderedDict()) self.context.update_context_variables(variables, level) request_config = config_dict.get('request', {}) parsed_request = self.context.get_parsed_request(request_config, level) base_url = parsed_request.pop("base_url", None) self.http_client_session = self.http_client_session or HttpSession( base_url) return parsed_request
def config_context(self, config_dict, level): if level == "testset": self.testcase_parser.file_path = config_dict.get("path", None) requires = config_dict.get('requires', []) self.import_requires(requires) function_binds = config_dict.get('function_binds', {}) self.bind_functions(function_binds, level) # import_module_functions will be deprecated soon module_items = config_dict.get('import_module_items', []) \ or config_dict.get('import_module_functions', []) self.import_module_items(module_items, level) variables = config_dict.get('variables') \ or config_dict.get('variable_binds', OrderedDict()) self.bind_variables(variables, level)
def __init__(self): self.testset_shared_variables_mapping = OrderedDict() self.testcase_variables_mapping = OrderedDict() self.testcase_parser = testcase.TestcaseParser() self.init_context()
def __init__(self): self.testset_shared_variables_mapping = OrderedDict() self.testcase_variables_mapping = OrderedDict() self.testcase_parser = TestcaseParser() self.evaluated_validators = [] self.init_context()