示例#1
0
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
示例#2
0
 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': '******'
     }]
示例#3
0
 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"
             },
         ],
     )
示例#4
0
 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": "******"
             },
         ],
     )
示例#5
0
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
示例#6
0
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