def parse_string_functions(content, variables_mapping, functions_mapping): """ parse string content with functions mapping. Args: content (str): string content to be parsed. variables_mapping (dict): variables mapping. functions_mapping (dict): functions mapping. Returns: str: parsed string content. Examples: >>> content = "abc${add_one(3)}def" >>> functions_mapping = {"add_one": lambda x: x + 1} >>> parse_string_functions(content, functions_mapping) "abc4def" """ functions_list = extract_functions(content) for func_content in functions_list: function_meta = parse_function(func_content) func_name = function_meta["func_name"] args = function_meta.get("args", []) kwargs = function_meta.get("kwargs", {}) args = parse_data(args, variables_mapping, functions_mapping) kwargs = parse_data(kwargs, variables_mapping, functions_mapping) if func_name in ["parameterize", "P"]: if len(args) != 1 or kwargs: raise exceptions.ParamsError("P() should only pass in one argument!") from httprunner import loader eval_value = loader.load_csv_file(args[0]) elif func_name in ["environ", "ENV"]: if len(args) != 1 or kwargs: raise exceptions.ParamsError("ENV() should only pass in one argument!") eval_value = utils.get_os_environ(args[0]) else: func = get_mapping_function(func_name, functions_mapping) eval_value = func(*args, **kwargs) func_content = "${" + func_content + "}" if func_content == content: # content is a function, e.g. "${add_one(3)}" content = eval_value else: # content contains one or many functions, e.g. "abc${add_one(3)}def" content = content.replace( func_content, str(eval_value), 1 ) return content
def test_load_csv_file_multiple_parameters(self): csv_file_path = os.path.join(os.getcwd(), 'tests', 'data', 'account.csv') csv_content = loader.load_csv_file(csv_file_path) assert csv_content == [{ 'username': '******', 'password': '******' }, { 'username': '******', 'password': '******' }, { 'username': '******', 'password': '******' }]
def test_load_csv_file_one_parameter(self): csv_file_path = os.path.join(os.getcwd(), "examples/httpbin/user_agent.csv") csv_content = loader.load_csv_file(csv_file_path) self.assertEqual( csv_content, [ { "user_agent": "iOS/10.1" }, { "user_agent": "iOS/10.2" }, { "user_agent": "iOS/10.3" }, ], )
def test_load_csv_file_multiple_parameters(self): csv_file_path = os.path.join(os.getcwd(), "examples/httpbin/account.csv") csv_content = loader.load_csv_file(csv_file_path) self.assertEqual( csv_content, [ { "username": "******", "password": "******" }, { "username": "******", "password": "******" }, { "username": "******", "password": "******" }, ], )
def parse_string_functions(content, variables_mapping, functions_mapping): ''' parse string content with functions mapping. Args: content (str): string content to be parsed. variables_mapping (dict): variables_mapping functions_mapping (dict): functions_mapping Returns: str: parsed string content Examples: >>> content = "abc${add_one(3)}def" >>> functions_mapping = {"add_one": lambda x: x + 1} >>> parse_string_functions(content,functions_mapping) "abc4def ''' functions_list = extract_functions(content) for func_content in functions_list: function_meta = parse_function(func_content) func_name = function_meta['func_name'] args = function_meta.get("args", []) kwargs = function_meta.get('kwargs', {}) args = parse_data(args, variables_mapping, functions_mapping) kwargs = parse_data(kwargs, variables_mapping, functions_mapping) if func_name in ["parameterize", 'P']: from httprunner import loader eval_value = loader.load_csv_file(*args, **kwargs) else: func = get_mapping_funciton(func_name, functions_mapping) eval_value = func(*args, **kwargs) func_content = "${" + func_content + "}" if func_content == content: # content is a function content = eval_value else: # content contains one or many functions content = content.replace(func_content, str(eval_value), 1) return content
def parse_string_functions(content, variables_mapping, functions_mapping, runner=None): """ parse string content with functions mapping. Args: content (str): string content to be parsed. variables_mapping (dict): variables mapping. functions_mapping (dict): functions mapping. runner (object) Returns: str: parsed string content. Examples: >>> content = "abc${add_one(3)}def" >>> functions_mapping = {"add_one": lambda x: x + 1} >>> parse_string_functions(content, functions_mapping) "abc4def" """ functions_list = extract_functions(content) for func_content in functions_list: # logger.log_debug("【执行函数】: {}".format(func_content)) function_meta = parse_function(func_content) func_name = function_meta["func_name"] logger.log_info("【识别函数】: {}".format(func_name)) args = function_meta.get("args", []) kwargs = function_meta.get("kwargs", {}) args = parse_data(args, variables_mapping, functions_mapping) logger.log_info("【函数{0}参数列表】: {1}".format(func_name, args)) kwargs = parse_data(kwargs, variables_mapping, functions_mapping) if func_name in ["parameterize", "P"]: from httprunner import loader eval_value = loader.load_csv_file(*args, **kwargs) else: func = get_mapping_function(func_name, functions_mapping) try: eval_value = func(*args, **kwargs) if eval_value is False: logger.log_error("【函数{0}异常返回】: {1}".format( func_name, eval_value)) else: logger.log_info("【函数{0}返回】: {1}".format( func_name, eval_value)) except Exception as err: logger.log_error("【函数{0}异常返回】: {1}".format( func_name, err.args[0])) eval_value = '自定义方法调用失败' if eval_value is False or eval_value == '自定义方法调用失败': if runner.running_hook == 'step_setup': runner.step_setup_pass = False elif runner.running_hook == 'step_teardown': runner.step_teardown_pass = False elif runner.running_hook == 'step_request_teardown': runner.step_request_teardown_pass = False elif runner.running_hook == 'step_parse_variable': runner.step_parse_variable_pass = False func_content = "${" + func_content + "}" if func_content == content: # content is a function, e.g. "${add_one(3)}" content = eval_value else: # content contains one or many functions, e.g. "abc${add_one(3)}def" content = content.replace(func_content, str(eval_value), 1) return content