def run_by_single(index, base_url, path): """ 加载单个case用例信息 :param index: int or str:用例索引 :param base_url: str:环境地址 :return: dict """ 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) request = eval(obj.request) name = obj.name project = obj.belong_project module = obj.belong_module.module_name 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) try: debugtalk = DebugTalk.objects.get(belong_project__project_name=project).debugtalk except ObjectDoesNotExist: debugtalk = '' dump_python_file(os.path.join(testcase_dir_path, '__init__.py'), '') dump_python_file(os.path.join(testcase_dir_path, 'debugtalk.py'), 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) config_request.get('config').get('request').setdefault('base_url', base_url) config_request['config']['name'] = name testcase_list[0] = config_request else: id = test_info[0] pre_request = eval(TestCaseInfo.objects.get(id=id).request) testcase_list.append(pre_request) except ObjectDoesNotExist: return testcase_list if request['test']['request']['url'] != '': testcase_list.append(request) dump_yaml_file(os.path.join(testcase_dir_path, name + '.yml'), testcase_list)
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
def run_by_single(index, base_url, path): """ 加载单个case用例信息 :param index: int or str:用例索引 :param base_url: str:环境地址 :return: dict """ testcase_list = { 'config': { 'name': '', 'verify': "false", 'variables': {}, 'base_url': base_url } } testcase_list['teststeps'] = [] try: obj = TestCaseInfo.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 testcase_list['config']['name'] = name testcase_dir_path = os.path.join(path, project) #加载全局变量 if request['request']['url'] == '' and "variables" in request.keys(): testcase_list['config']['variables'] = request['variables'] if not os.path.exists(testcase_dir_path): os.makedirs(testcase_dir_path) 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'), 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)['config'] #config_request.get('config').get('request').setdefault('base_url', base_url) #config_request['config']['name'] = name testcase_list['teststeps'].append( modify_validate(config_request)) else: id = test_info[0] pre_request = eval(TestCaseInfo.objects.get(id=id).request) testcase_list['teststeps'].append(modify_validate(pre_request)) except ObjectDoesNotExist: return testcase_list if request['request']['url'] != '': testcase_list['teststeps'].append(modify_validate(request)) testcase_dir_path = os.path.join(testcase_dir_path, name + '.yml') dump_yaml_file(testcase_dir_path, testcase_list)
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, 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
def run_by_single(index, base_url, path): """ 对于当个测试用例的运行 :param index: int or str:用例索引 :param base_url: str:环境地址 : http://47.94.172.250:33334 :param path: api接口名字 /api/v1/account/login :return: """ test_case_list = [] config = {'config': {'name': '', 'request': {'base_url': base_url}}} test_case_list.append(config) try: obj = TestCaseInfo.objects.get(id=index) except ObjectDoesNotExist: return test_case_list include = eval(obj.include) request = eval(obj.request) name = obj.name project = obj.belong_project module = obj.belong_module.module_name config['config']['name'] = name test_case_dir_path = os.path.join(path, project) if not os.path.exists(test_case_dir_path): os.makedirs(test_case_dir_path) try: debugtalk = DebugTalk.objects.get( belong_project__project_name=project).debugtalk except ObjectDoesNotExist: debugtalk = '' # 添加dubugtalk.py文件的路径 dump_python_file(os.path.join(test_case_dir_path, 'debugtalk.py'), debugtalk) # 单个测试用例的运行路径 test_case_dir_path = os.path.join(test_case_dir_path, module) if not os.path.exists(test_case_dir_path): os.mkdir(test_case_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) config_request.get('config').get('request').setdefault( 'base_url', base_url) # config_request.get('request').setdefault('base_url', base_url) config_request['config']['name'] = name test_case_list[0] = config_request else: pk = test_info[0] pre_request = eval(TestCaseInfo.objects.get(id=pk).request) test_case_list.append(pre_request) except ObjectDoesNotExist: return test_case_list if request['test']['request']['url'] != '': test_case_list.append(request) dump_yaml_file(os.path.join(test_case_dir_path, name + '.yml'), test_case_list)
def run_by_single(index, base_url, path): """ 加载单个case用例信息 :param index: int or str:用例索引 :param base_url: str:环境地址 :return: dict """ testcase_list = { 'config': { 'name': '', 'verify': "false", 'variables': {}, 'base_url': base_url } } testcase_list['teststeps'] = [] try: obj = TestCaseInfo.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 #替换当前用例的端口 if 'base_url' in request['request'] and request['request']['base_url']: testcase_list['config']['base_url'] = request['request']['base_url'] testcase_list['config']['name'] = name testcase_dir_path = os.path.join(path, project) #加载全局变量 if request['request']['url'] == '' and "variables" in request.keys(): testcase_list['config']['variables'] = request['variables'] if not os.path.exists(testcase_dir_path): os.makedirs(testcase_dir_path) 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'), debugtalk) #检查debugtakl.py 代码是否有异常,如果有抛出异常 debugtalk_dir = os.path.join(testcase_dir_path, 'debugtalk.py') check_result = checkPath(debugtalk_dir) logger.info("check_result的值为:{}".format(check_result)) if isinstance(check_result, int) and check_result == 1: shutil.rmtree(testcase_dir_path) raise AnalysisError("python文件解析异常,请检查debugtalk.py文件信息") else: msg = check_result[0] if msg > 0: errors = [] for err in check_result[1]: errors.append(str(err.split(separator)[-1]) + "\n") shutil.rmtree(testcase_dir_path) raise SyntaxError(errors) 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)['config'] testcase_list['teststeps'].append( modify_validate(config_request)) else: id = test_info[0] pre_request = eval(TestCaseInfo.objects.get(id=id).request) testcase_list['teststeps'].append(modify_validate(pre_request)) except ObjectDoesNotExist: return testcase_list if request['request']['url'] != '': testcase_list['teststeps'].append(modify_validate(request)) testcase_dir_path = os.path.join(testcase_dir_path, name + '.yml') dump_yaml_file(testcase_dir_path, testcase_list)
def _generate_suite_file(suite_name, include, path, cfg_id): """ 组装测试用例到Suite中 config: name: test uCloud base_url: 10.3.14.78:8888 testcases: login: testcase: webviewer.yaml variables: key1:value1 key2:value2 key3:value3 parameters: user_id:[1,2,3,4,5] testcase: test_name.yaml variables: key1:value1 key2:value2 key3:value3 parameters: user_name:[a,b,c,d] """ test_suite = {} config = {} config_request = eval(TestCaseInfo.objects.get(id=cfg_id).request) if "variables" in config_request.keys(): config.setdefault("variables", config_request.get("variables")) if "base_url" in config_request.keys(): config.setdefault("base_url", config_request.get("base_url")) config.setdefault("name", suite_name) test_suite.setdefault("config", config) cases = {} for val in include: case_detail = {} case_id = val[0] #case_name = val[1] #将测试用例中的parameters中挪到这里来 test_obj = TestCaseInfo.objects.get(id=case_id) case_name = test_obj.name project = test_obj.belong_project module = test_obj.belong_module.module_name #如果所有的文件都是被导出的json,这里就用Json,否则就是yaml文件 case_detail.setdefault( "testcase", r"{}/{}/{}.yml".format(project, module, case_name)) test_case_request = eval(test_obj.request) if "parameters" in test_case_request["test"].keys(): params = test_case_request['test']['parameters'] tmp = [] for param in params: par = {} for key, value in param.items(): if '[' in value and ']' in value: par[key] = eval(value) else: #file file_path = get_file_path(project, module, value) val = os.path.join(os.getcwd(), file_path).replace('\\', '/') par[key] = '${P(' + val + ')}' tmp.append(par) case_detail.setdefault("parameters", tmp) cases.setdefault(case_name, case_detail) test_suite.setdefault("testcases", cases) #暂时将测试用例放到主目录下吧 testcase_dir_path = path #dump_json_file(os.path.join(testcase_dir_path, suite_name + '.yaml'), test_case_list) dump_yaml_file(os.path.join(testcase_dir_path, suite_name + '.yml'), test_suite)
def run_by_single(index, base_url, path, cfg_id): """ 加载单个case用例信息 :param index: int or str:用例索引 :param base_url: str:环境地址 :return: dict """ """ httprunner已经更新到2.2.5版本,所以,在config中没有request子项,直接写base_url. config = { 'config': { 'name': '', 'request': { 'base_url': base_url } } } """ config = {'config': {'name': '', '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) request = eval(obj.request) #If ca is needed ca_value = obj.ca.value name = obj.name project = obj.belong_project module = obj.belong_module.module_name 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) #update by zlinghu: 共用主目录下的debugtalk.py文件,所以直接copy过来即可 debugtalk = os.path.join(os.getcwd(), "debugtalk.py") if not os.path.exists(debugtalk): logger.info( "No debugtalk found, please check if you have provided debugtalk!" ) return else: shutil.copy(debugtalk, os.path.join(path, 'debugtalk.txt')) os.rename(os.path.join(path, 'debugtalk.txt'), os.path.join(path, 'debugtalk.py')) testcase_dir_path = os.path.join(testcase_dir_path, module) if not os.path.exists(testcase_dir_path): os.mkdir(testcase_dir_path) has_cfg = False # 这里是判断它的前提条件里面是否有依赖用例或者是配置文件 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) # setdefault: 如果存在键值,则返回当前值,否则新增键值,且它的值为给定的默认值(第二个参数)。 config_request.get('config').setdefault('base_url', base_url) #因为httprunner升级,config节点下没有request子节点,而是直接写base_url #config_request.get('config').get('request').setdefault('base_url', base_url) config_request['config']['name'] = name testcase_list[0] = config_request has_cfg = True else: id = test_info[0] # TODO:消除测试用例级别的params.... 直接移除字典中的key(params)-value不知是否可行 pre_request = eval(TestCaseInfo.objects.get(id=id).request) if pre_request['test']['request']['url'] != '': #if ca is needed ca_value_pre = TestCaseInfo.objects.get(id=id).ca.value pre_request = update_request(pre_request, ca_value_pre) testcase_list.append(pre_request) except ObjectDoesNotExist as e: logger.info(e) return testcase_list # 将cfg提到suite级别后,在每个test中都手动添加suite级别添加的config文件。 # TODO:suite级别的测试配置文件,需要更新到每一个测试用例级别吗?直接放在suite级别不可以吗? if not has_cfg: config_id = cfg_id config_request = eval(TestCaseInfo.objects.get(id=config_id).request) config_request.get('config').setdefault('base_url', base_url) #因为httprunner升级,config节点下没有request子节点,而是直接写base_url #config_request.get('config').get('request').setdefault('base_url', base_url) config_request['config']['name'] = name testcase_list[0] = config_request if request['test']['request']['url'] != '': request = update_request(request, ca_value) testcase_list.append(request) #更新每个测试用例,将配置文件中的header等信息更新到用例中去。 update_request_ex(testcase_list, cfg_id) dump_yaml_file(os.path.join(testcase_dir_path, name + '.yml'), testcase_list)