def run_by_logic_test(index, base_url, path, order_prefix=''): config = {'config': {'name': '', 'request': {'base_url': base_url}}} testcase_list = [] testcase_list.append(config) try: obj = TestCaseLogicInfo.objects.get(id=index) except ObjectDoesNotExist: return testcase_list include = eval(obj.include) request = eval(obj.request) name = obj.name project = obj.belong_project module = obj.belong_module.module_name project_info = ProjectInfo.objects.get_pro_name(project, type=False) # 获取工程关联的配置 if project_info.config_id is not None: try: basic_config_request = TestCaseLogicInfo.objects.get( id=project_info.config_id).request basic_request = eval(basic_config_request) if basic_request.get('config').get('request') is not None: basic_request.get('config').get('request').setdefault( 'base_url', base_url) basic_request['config']['name'] = name testcase_list[0] = basic_request except ObjectDoesNotExist: # raise ObjectDoesNotExist('项目关联的配置信息不存在,请检查') print('项目关联的配置信息不存在') # 获取模块关联的配置 if obj.belong_module.config_id is not None: try: basic_config_request = TestCaseLogicInfo.objects.get( id=obj.belong_module.config_id).request module_request = eval(basic_config_request) if module_request.get('config').get('request') is not None: module_request.get('config').get('request').setdefault( 'base_url', base_url) module_request['config']['name'] = name # 合并配置信息 merge_config(testcase_list[0], module_request) testcase_list[0] = module_request except ObjectDoesNotExist: # raise ObjectDoesNotExist('模块关联的配置信息不存在,请检查') print('模块关联的配置信息不存在') config['config']['name'] = name testcase_dir_path = os.path.join(path, project) if not os.path.exists(testcase_dir_path): os.makedirs(testcase_dir_path) path = os.path.abspath(os.path.dirname(sys.argv[0])) w = open(path + '/' + 'ApiManager/utils/basic_function.py', encoding='utf8') basic_function = w.read() try: debugtalk = DebugTalk.objects.get( belong_project__project_name=project).debugtalk except ObjectDoesNotExist: debugtalk = '' dump_python_file(os.path.join(testcase_dir_path, 'debugtalk.py'), basic_function + '\n' + '\n' + debugtalk) testcase_dir_path = os.path.join(testcase_dir_path, module) if not os.path.exists(testcase_dir_path): os.mkdir(testcase_dir_path) for test_info in include: try: if isinstance(test_info, dict): config_id = test_info.pop('config')[0] config_request = eval( TestCaseInfo.objects.get(id=config_id).request) if config_request.get('config').get('request') is not None: config_request.get('config').get('request').setdefault( 'base_url', base_url) config_request['config']['name'] = name # 合并配置信息 merge_config(testcase_list[0], config_request) testcase_list[0] = config_request else: id = test_info[0] pre_request = eval(TestCaseInfo.objects.get(id=id).request) testcase_list.append(pre_request) # 清除get_cache_case的缓存 del_case_cache(id) except ObjectDoesNotExist: return testcase_list if request['test']['request']['url'] != '': testcase_list.append(request) # 剔除备注使用的特殊关键字 variables = testcase_list[0].get('config', {}).get('variables') if variables: for variab in variables: if isinstance(variab, dict): if '&remark&' in variab.keys(): variab.pop('&remark&') dump_yaml_file( os.path.join(testcase_dir_path, order_prefix + name + '.yml'), testcase_list) # 清除get_cache_case的缓存 del_case_cache(obj.id) return obj.name
if request['test']['request']['url'] != '': testcase_list.append(request) # 剔除备注使用的特殊关键字 variables = testcase_list[0].get('config', {}).get('variables') if variables: for variab in variables: if isinstance(variab, dict): if '&remark&' in variab.keys(): variab.pop('&remark&') dump_yaml_file(os.path.join(testcase_dir_path, name + '.yml'), testcase_list) # 清除get_cache_case的缓存 del_case_cache(case_info.get('test_index')) # 单纯执行用例,不引入配置 def run_by_single3(index, base_url, path): config = {'config': {'name': '', 'request': {'base_url': base_url}}} testcase_list = [] testcase_list.append(config) try: obj = TestCaseInfo.objects.get(id=index) except ObjectDoesNotExist: return testcase_list include = eval(obj.include)
def run_by_single2(request, base_url, path): config = {'config': {'name': '', 'request': {'base_url': base_url}}} testcase_list = [] testcase_list.append(config) case_info = request.get('test').get('case_info') module_id = case_info.get('module') belong_module = None try: belong_module = ModuleInfo.objects.get_module_name(module_id, type=False) module = belong_module.module_name except ObjectDoesNotExist: module = '缺省模块' include = eval(str(case_info.get('include'))) name = request.get('test').get('name') project = case_info.get('project') project_info = ProjectInfo.objects.get_pro_name(project, type=False) # 获取工程关联的配置 if project_info.config_id is not None: try: basic_config_request = TestCaseInfo.objects.get( id=project_info.config_id).request basic_request = eval(basic_config_request) if basic_request.get('config').get('request') is not None: basic_request.get('config').get('request').setdefault( 'base_url', base_url) basic_request['config']['name'] = name testcase_list[0] = basic_request except ObjectDoesNotExist: # raise ObjectDoesNotExist('项目关联的配置信息不存在,请检查') print('项目关联的配置信息不存在') # 获取模块关联的配置 if belong_module is not None and belong_module.config_id is not None: try: basic_config_request = TestCaseInfo.objects.get( id=belong_module.config_id).request module_request = eval(basic_config_request) if module_request.get('config').get('request') is not None: module_request.get('config').get('request').setdefault( 'base_url', base_url) module_request['config']['name'] = name # 合并配置信息 merge_config(testcase_list[0], module_request) testcase_list[0] = module_request except ObjectDoesNotExist: # raise ObjectDoesNotExist('模块关联的配置信息不存在,请检查') print('模块关联的配置信息不存在') config['config']['name'] = name testcase_dir_path = os.path.join(path, project) if not os.path.exists(testcase_dir_path): os.makedirs(testcase_dir_path) path = os.path.abspath(os.path.dirname(sys.argv[0])) w = open(path + '/' + 'ApiManager/utils/basic_function.py', encoding='utf8') basic_function = w.read() try: debugtalk = DebugTalk.objects.get( belong_project__project_name=project).debugtalk except ObjectDoesNotExist: debugtalk = '' dump_python_file(os.path.join(testcase_dir_path, 'debugtalk.py'), basic_function + '\n' + '\n' + debugtalk) testcase_dir_path = os.path.join(testcase_dir_path, module) if not os.path.exists(testcase_dir_path): os.mkdir(testcase_dir_path) for test_info in include: try: if isinstance(test_info, dict): config_id = test_info.pop('config')[0] config_request = eval( TestCaseInfo.objects.get(id=config_id).request) if config_request.get('config').get('request') is not None: config_request.get('config').get('request').setdefault( 'base_url', base_url) config_request['config']['name'] = name # 合并配置信息 merge_config(testcase_list[0], config_request) testcase_list[0] = config_request else: id = test_info[0] case = TestCaseInfo.objects.get(id=id) pre_request = eval(case.request) if case.type == 2: if pre_request.get('config').get('request') is not None: pre_request.get('config').get('request').setdefault( 'base_url', base_url) pre_request['config']['name'] = name # 合并配置信息 merge_config(testcase_list[0], pre_request) testcase_list[0] = pre_request else: testcase_list.append(pre_request) # 清除get_cache_case的缓存 del_case_cache(id)
def run3(self, path_or_testsets, mapping=None): try: test_suite_list = init_test_suites2(path_or_testsets) except exceptions.TestcaseNotFound: logger.log_error( "Testcases not found in {}".format(path_or_testsets)) sys.exit(1) self.summary = { "success": True, "stat": {}, "time": {}, "platform": get_platform(), "details": [] } mapping = mapping or {} def accumulate_stat(origin_stat, new_stat): """ accumulate new_stat to origin_stat """ for key in new_stat: if key not in origin_stat: origin_stat[key] = new_stat[key] elif key == "start_at": # start datetime origin_stat[key] = min(origin_stat[key], new_stat[key]) else: origin_stat[key] += new_stat[key] # 各用例提取的变量 extract_parameter = {} for test_suite in test_suite_list: extract_list = test_suite.get('testcases', {})[0].get('extract') # # 合并各用例提取的变量 # variables = test_suite.testcase_parser.variables # test_suite.testcase_parser.update_binded_variables(dict(variables, **extract_parameter)) try: test_suite = TestSuite_ext(test_suite, dict(extract_parameter, **mapping)) except exceptions.ParamsError as e: raise Exception("出现异常,参数错误: {0}".format(e)) except exceptions.VariableNotFound as e: raise Exception("出现异常,变量不存在: {0}".format(e)) except BaseException as e: raise Exception("出现异常: {0}".format(e)) result = self.runner.run(test_suite) test_suite_summary = get_summary(result) name = test_suite.config.get("name") test_infos = TestCaseInfo.objects.filter(name=name).all() test_infos = list(test_infos) if test_infos: # 清除get_cache_case的缓存 del_case_cache(test_infos[0].id) self.summary["success"] &= test_suite_summary["success"] test_suite_summary["name"] = name test_suite_summary["base_url"] = test_suite.config.get( "request", {}).get("base_url", "") test_suite_summary["output"] = test_suite.output print_output(test_suite_summary["output"]) accumulate_stat(self.summary["stat"], test_suite_summary["stat"]) accumulate_stat(self.summary["time"], test_suite_summary["time"]) # 根据返回结果提取变量值 if extract_list is not None and isinstance(extract_list, list): records = test_suite_summary.get('records') data_result = records[0].get('meta_data').get('response').get( 'json') if data_result is not None: for extract in extract_list: print(extract) for key, value in extract.items(): try: extract_value = {} extract_value['content'] = data_result fields = str(value).split('.') extract_success = True for field in fields: if isinstance(extract_value, dict): extract_value = extract_value.get( field) elif isinstance(extract_value, list): if extract_value: extract_value = extract_value[int( field)] else: extract_success = False # raise Exception('提取变量失败,', '路径:', value, '下的结果不存在,请检查') if extract_success: extract_parameter[key] = extract_value except AttributeError as e: print('run运行错误:未提取到变量') except Exception as e: logger.log_error("出现错误.{0}".format(e)) self.summary["details"].append(test_suite_summary) return self