diff --git a/case_utils/requests_utils/data_handle.py b/case_utils/requests_utils/data_handle.py index 523977d..c7c94c4 100644 --- a/case_utils/requests_utils/data_handle.py +++ b/case_utils/requests_utils/data_handle.py @@ -287,6 +287,10 @@ class DataHandle: return replaced_text, placeholders def data_handle(self, obj, source=None): + obj = self.eval_data(obj) + return self.data_handle_(obj, source) + + def data_handle_(self, obj, source=None): """ 递归处理字典、列表中的字符串,将${}占位符替换成source中的值 """ @@ -310,15 +314,26 @@ class DataHandle: obj, keys = self.replace_and_store_placeholders(pattern, obj) # 接着处理表达式和关键字替换,先进行关键字替换 keys = eval(Template(str(keys)).safe_substitute(source)) # 替换并转为字典 + + should_eval = 0 for key, value in keys.items(): # 遍历字典替换 obj = obj.replace(key, value[0]) + if not isinstance(source[value[1]], str): + should_eval = 1 + if should_eval == 1: + obj = self.eval_data(obj) + + if not isinstance(obj, str): + return self.data_handle(obj) + # 再找一遍剩余的${}跟第一步的结果合并,提取漏掉的诸如1+1的表达式(在此认为关键字无法替换的都是表达式,最后表达式也无法处理的情况就报错或者原样返回) obj, func_temp = self.replace_and_store_placeholders(pattern, obj) func.update(func_temp) # 进行函数调用替换 obj = self.invoke_funcs(obj, func) - # 把处理后的结果,eval一下 - return self.eval_data(obj) + # 直接返回最后的结果 + return obj + # return self.eval_data(obj) elif isinstance(obj, list): for index, item in enumerate(obj): obj[index] = self.data_handle(item, source) @@ -371,103 +386,121 @@ data_handle = DataHandle().data_handle if __name__ == '__main__': # 下面是测试代码 + + print("-----------测试场景1---------------------") + # 需要识别${python表达式},这里random方法是需要导入random包的 + data_01 = "选择.gitignore: ${random.choice(['Ada', 'Actionscript', 'Ansible', 'Android', 'Agda'])},开源许可证: ${random.choice(['0BSD', 'AAL', 'AFL-1.1', '389-exception'])}" + new = data_handle(data_01) + print(new, type(new)) + + print("-----------测试场景2---------------------") target = { "user_id": 1, "user_name": "flora", "name": "test", "age": 17 } - # 需要识别${python表达式},这里random方法是需要导入random包的 - data_01 = "选择.gitignore: ${random.choice(['Ada', 'Actionscript', 'Ansible', 'Android', 'Agda'])},开源许可证: ${random.choice(['0BSD', 'AAL', 'AFL-1.1', '389-exception'])}" - # new = data_handle(data_01) - # print(new, type(new)) - # 这个用到了target data_02 = { - "age": "${generate_random_int()}.", + "age": "${generate_random_int()}", "message": "Hello, ${FakerData().generate_female_name()}! Your age is ${age}. Random number: ${FakerData().generate_random_int()}", "nested_data": [ "This is ${name}'s data.", { - "message": "Age: ${age}.", + "message": "Age: ${age}", "nested_list": [ "More data: ${generate_random_int()}", ] } ] } - # new = data_handle(data_02, target) - # print(new, type(new)) + new = data_handle(data_02, target) + print(new, type(new)) + print("-----------测试场景3---------------------") data_03 = "user_id: ${user_id}, user_name: ${user_name}" - # new = data_handle(data_03, target) - # print(new, type(new)) + new = data_handle(data_03, target) + print(new, type(new)) + print("-----------测试场景4---------------------") # 需要识别 字符串里面是python表达式的情况 data_04 = "[1,2,3,4]" - # new = data_handle(data_04) - # print(new, type(new)) + new = data_handle(data_04) + print(new, type(new)) + print("-----------测试场景5---------------------") data_05 = "1+1" - # new = data_handle(data_05) - # print(new, type(new)) + new = data_handle(data_05) + print(new, type(new)) + print("-----------测试场景6---------------------") data_06 = "[1, '1', [1, 2], {'name':'flora', 'age': '1'}]" - # new = data_handle(data_06) - # print(new, type(new)) + new = data_handle(data_06) + print(new, type(new)) + print("-----------测试场景7---------------------") # 需要识别自定义的函数,同时支持多种,下面两种写法有细微差别 data_07 = "Hello, ${generate_female_name()}! Random number: ${generate_random_int()}" - # new = data_handle(data_07) - # print(new, type(new)) + new = data_handle(data_07) + print(new, type(new)) + print("-----------测试场景8---------------------") data_08 = "Hello, ${generate_female_name()}! Random number: ${FakerData().generate_random_int()}" - # new = data_handle(data_08) - # print(new, type(new)) + new = data_handle(data_08) + print(new, type(new)) + print("-----------测试场景9---------------------") data_09 = "Hello, ${FakerData().generate_female_name()}! Random number: ${FakerData.generate_random_int()}" - # new = data_handle(data_09) - # print(new, type(new)) + new = data_handle(data_09) + print(new, type(new)) + print("-----------测试场景10---------------------") data_10 = { "payload": { "startTime": "${FakerData.generate_time('%Y-%m-%d')}", "common2": "${faker.name()}", # 这里是使用类FakerData里面的实例属性faker - "url": "/api/accounts/${FakerData.generate_time('%Y-%m-%d')} / login.json", + "url": "/api/accounts/${FakerData.generate_time('%Y-%m-%d')}/login.json", "fragement": { "startTime": "${FakerData.generate_time('%Y-%m-%d')}", "common2": "${faker.name()}", # 这里是使用类FakerData里面的实例属性faker - "url": "/api/accounts/${FakerData.generate_time('%Y-%m-%d')} / login.json" + "url": "/api/accounts/${FakerData.generate_time('%Y-%m-%d')}/login.json" } } } - # new = data_handle(data_10) - # print(new, type(new)) + new = data_handle(data_10) + print(new, type(new)) + print("-----------测试场景11---------------------") data_11 = "/api/accounts/${FakerData.generate_time('%Y-%m-%d')}/login.json" - # new = data_handle(data_11) - # print(new, type(new)) + new = data_handle(data_11) + print(new, type(new)) + print("-----------测试场景12---------------------") # FakerData类中没有封装random_name这个方法,会无法处理 data_12 = '[[1,2,3,4],"${FakerData().random_name()}"]' - # new = data_handle(data_12) - # print(new, type(new)) + new = data_handle(data_12) + print(new, type(new)) + + print("-----------测试场景13---------------------") # 下面这种写法不是字符串里面,不是正确格式的列表,${FakerData().generate_name()需要用引号包起来,因此无法正确处理成列表,最后返回的是str data_13 = '[[1,2,3,4],${FakerData().generate_name()}]' - # new = data_handle(data_13) - # print(new, type(new)) + new = data_handle(data_13) + print(new, type(new)) - data_15 = '[[1,2,3,4],${FakerData().generate_random_int()}]' - # new = data_handle(data_15) - # print(new, type(new)) + print("-----------测试场景14---------------------") + data_14 = '[[1,2,3,4],${FakerData().generate_random_int()}]' + new = data_handle(data_14) + print(new, type(new)) + print("-----------测试场景15---------------------") # 导入其他方法,也可以直接使用 # from common_utils.time_handle import test_fun_a # data = "${test_fun_a()}" # new = data_handle(data) # print(new, type(new)) + print("-----------测试场景16---------------------") # 支付方法传参使用 payload = { "name": "${generate_name(lan='zh')}", @@ -475,5 +508,18 @@ if __name__ == '__main__': "desc": '[[1,2,3,4],"${FakerData().generate_random_int()}"]', "pre": '[[1,2,3,4],${FakerData().generate_name()}]' } - # new = data_handle(payload) - # print(new, type(new)) + new = data_handle(payload) + print(new, type(new)) + + print("-----------测试场景17---------------------") + data_17 = { + "winner_id": "${winner_id}", + "user_id": "${user_id}" + } + source = { + "winner_id": "1,2,4", + "user_id": [] + } + + res = data_handle(obj=data_17, source=source) + print(res)