def execute_interface_test(interface_test_id=None): if interface_test_id == None: return {'error': '无效的请求'}, 404 db = get_db() logger = get_logger() user_id = session.get('user_id') user_obj = db.query(Userinfo).filter(Userinfo.id == user_id).first() logger.debug("执行内容:%s, 执行的用户id:%s, 执行的接口测试id:%s" % ('interface_test', user_obj.id, interface_test_id)) data = { 'opt': 'execute_interface_test', 'data': { 'interface_test_id': interface_test_id, 'user_id': session.get('user_id') } } ret = send_to_redis(data) if ret != 1: logger.warning('像redis添加数据失败.') return {'error': '执行失败! 请稍后重试.'}, 500 # try: # send_to_selenium(data) # except ConnectionResetError as error: # # 让其重新连接,但不再发数据 # send_to_selenium({}, conn_flag=True) # # 告诉前端这次请求失败 # logger.warning('连接selenium失败. %s' % error) # return {'error': '执行失败! 请稍后重试.'}, 500 return {}, 202
def delete(self): ret = {'flag': 0} # 获取用例id uc_id = request.form.get('use_case_id') db = get_db() # 删除用例逻辑,由于sqlalchemy没有级联删除,只能从没有建立外键的表删起来 # 1. 先找出用例的步骤详情 step_obj = db.query(Step_detail).filter( Step_detail.uc_id == uc_id).all() step_detail_id = [obj.id for obj in step_obj] # 2. 通过用例步骤的id去删除步骤执行结果的内容 db.query(Result_step).filter( or_(Result_step.step_id.in_(step_detail_id), Result_step.parent_step_id.in_(step_detail_id))).delete( synchronize_session=False) db.commit() # 3. 删除用例步骤和用例执行结果 del_db_data(db, db.query(Step_detail).filter(Step_detail.uc_id == uc_id)) del_db_data( db, db.query(Use_case_result).filter( Use_case_result.use_case_id == uc_id)) # 4. 删除用例 result = del_db_data(db, db.query(Use_case).filter(Use_case.id == uc_id)) # 删除会返回,删除了几条符合的结果,如果结果为0表示就没找到这条用例 if result == 0: ret['flag'] = 1 ret['error_info'] = '删除失败' return jsonify(ret)
def post(self): interface_test_data = json.loads(request.data) request_params = interface_test_data.pop('request_params') header_params = interface_test_data.pop('header_params') interface_test_data['user_id'] = session.get('user_id') # 验证数据,待填 # 保存数据 db = get_db() try: inter_obj = Interface_test(**interface_test_data) db.add(inter_obj) db.flush() temp_obj = [] for dic in request_params: dic['interface_test_id'] = inter_obj.id temp_obj.append(Params(**dic)) for dic in header_params: dic['interface_test_id'] = inter_obj.id dic['params_type'] = 'header' temp_obj.append(Params(**dic)) db.add_all(temp_obj) db.commit() except Exception as err: # 添加数据出错执行回滚操作 logger.error('添加接口数据出错: %s' % err) db.rollback() return {'error': '添加出错!'}, 422 return {}, 201
def read_excel_data(file_path): db = get_db() workbook = xlrd.open_workbook(file_path) sheet = workbook.sheet_by_index(0) dic = {} params = [] for index in range(sheet.nrows): row_data = sheet.row_values(index) if index == 1: project_obj = db.query(Project).filter(Project.project_name == row_data[1].strip()).first() dic['name'] = row_data[0] dic['project_id'] = project_obj.id if project_obj else '' dic['uc_type'] = row_data[2] dic['desc'] = row_data[3] elif index >= 3: temp = [] for data in row_data[:-1]: if data.strip() != '': temp.append(data) else: temp.append(str(int(row_data[-1]))) params.append('@@'.join(temp)) dic['params'] = '||'.join(params) dic['user_id'] = session.get('user_id') return dic
def delete(self): interface_test_id = request.form.get('interface_test_id', None) if interface_test_id is None: return {'error': '请求数据出错.'}, 422 db = get_db() inter_obj = db.query(Interface_test).filter( Interface_test.id == interface_test_id).first() if not inter_obj: return {'error': '该数据不存在!'}, 410 try: # (1) 删除接口测试结果 db.query(Interface_test_result).filter( Interface_test_result.interface_test_id == interface_test_id).delete() db.commit() # (2) 删除接口参数 db.query(Params).filter( Params.interface_test_id == interface_test_id).delete() db.commit() # (3) 删除接口测试数据 db.query(Interface_test).filter( Interface_test.id == interface_test_id).delete() db.commit() except Exception as error: db.rollback() logger.error('删除接口测试数据失败: %s' % error) return {'error': '删除失败!'}, 500 return {}, 204
def delete(self): crontab_id = request.form.get('crontab_id') logger.debug('删除的任务id: %s' % crontab_id) db = get_db() obj = db.query(Crontab).filter(Crontab.id == crontab_id).first() # 发送crontab程序,删除任务 try: send_to_crontab({'opt': 'del_task', 'data': {'crontab_id': crontab_id, 'task_id_name': obj.task_id_name}}) except ConnectionAbortedError as error: logger.warning('连接crontab失败. %s' % error) # 重连 send_to_crontab({}, conn_flag=True) return {'删除任务失败!'}, 500 # 接收删除任务的结果 sk = get_sk() del_result = recv_content(sk) logger.debug('添加任务的返回结果:%s' % del_result) if del_result.get('del_flag') != 0: return {'error': '删除任务失败!'}, 500 # 删除表数据 db.query(Crontab).filter(Crontab.id == crontab_id).delete() db.commit() return {}, 204
def get(self): db = get_db() # 获取用户 user_id = session.get('user_id') username = session.get('login_user') # 获取用例对象 uc_id = request.args.get('uc_id') uc_obj = db.query(Use_case).filter(Use_case.id == uc_id).first() # 获取用例结果对象 uc_result_id = request.args.get('uc_result_id') uc_result_obj = db.query(Use_case_result).filter(Use_case_result.id == uc_result_id).first() # 查询步骤得执行结果 result_step_objs = db.query(Result_step).filter(Result_step.uc_result_id == uc_result_id).all() # 格式化渲染得数据 result_list = [] step_success_count = 0 step_failed_count = 0 total_run_time = 0 for obj in result_step_objs: # 查询对应步骤的参数和是否执行 step_obj = db.query(Step_detail).filter(Step_detail.id == obj.step_id).first() error_info = obj.error_info if obj.error_info else '' result_list.append({'id': obj.id, 'params': step_obj.params, 'execute': step_obj.execute, 'status': obj.status, 'error_info': error_info, 'step_id': obj.step_id, 'parent_step_id': obj.parent_step_id, 'run_time': obj.run_time}) # 记录步骤失败和成功的数量 if obj.status == 1: step_success_count += 1 else: step_failed_count += 1 # 记录总运行时间 if not obj.parent_step_id or obj.step_id == obj.parent_step_id: total_run_time += obj.run_time return render_template('step_result.html', uc_obj=uc_obj, result_list=result_list, username=username, uc_result_obj=uc_result_obj, step_success_count=step_success_count, step_failed_count=step_failed_count, total_run_time=total_run_time)
def get_interface_test_data(interface_test_id): if interface_test_id is None: return {'error': 'not found.'}, 404 db = get_db() inter_obj = db.query(Interface_test).filter( Interface_test.id == interface_test_id).first() dic = { 'interface_name': inter_obj.interface_name, 'interface_type': inter_obj.interface_type, 'interface_description': inter_obj.interface_description, 'request_type': inter_obj.request_type, 'request_url': inter_obj.request_url, 'request_params': [], 'header_params': [], } params_objs = db.query(Params).filter( Params.interface_test_id == interface_test_id).all() for obj in params_objs: if obj.params_type == 'request': dic['request_params'].append({ 'key': obj.key, 'value': obj.value, 'description': obj.description, 'execute': obj.execute }) else: dic['header_params'].append({ 'key': obj.key, 'value': obj.value, 'description': obj.description, 'execute': obj.execute }) # print(dic) return dic
def login(): ret = {'flag': 0} data = request.form.to_dict() logger.debug('登陆数据: %s' % data) # 验证数据 db = get_db() username = data.get('username') # 进行md5摘要 password = get_md5(username, data.get('password')) # 查询数据 obj = db.query(Userinfo).filter(Userinfo.username == username, Userinfo.password == password).first() if obj: # 设置session session['user_id'] = obj.id session['login_user'] = username # 设置cookie response = make_response(jsonify(ret)) response.set_cookie('username', username) response.set_cookie('email', obj.email) return response else: ret['flag'] = 1 ret['error_info'] = 'username or password error.' return jsonify(ret)
def check_username_exists(username): flag = False db = get_db() obj = db.query(Userinfo).filter(Userinfo.username == username).first() if obj: flag = True return flag
def get_screen_shot(): uc_result_id = request.args.get('uc_result_id') db = get_db() result_step_obj = db.query(Result_step).filter(Result_step.uc_result_id == uc_result_id).all() img_file_lis = [] for obj in result_step_obj: if obj.screen_shot != None: img_file_lis.append('/static/screen_shot/' + obj.screen_shot) return render_template('use_case_screen_shot.html', img_file_lis=img_file_lis)
def check_public_uc_name(data): db = get_db() if data['uc_type'] == 'public': t = db.query(Use_case).filter(Use_case.uc_type == 'public', Use_case.name == data['name']).first() if t: return True return False
def get_public_use_case(): # 获取操作数据库的句柄 db = get_db() # 获取所有的公共用例 objs = db.query(Use_case).filter(Use_case.uc_type == 'public').all() # 进行格式化 public_uc_data = [] for obj in objs: public_uc_data.append({"id": obj.id, "use_case_name": obj.name}) return jsonify(public_uc_data)
def get(self): opt = request.args.get('opt') search_content = request.args.get('search_content') db = get_db() username = session.get('login_user') user_obj = db.query(Userinfo).filter( Userinfo.username == username).first() # 查询数据,获取数据总数,放置分页器 if not opt: interface_objs = db.query(Interface_test).filter( or_(Interface_test.user_id == user_obj.id, Interface_test.interface_type == 'public')) else: search_content = '%' + search_content.strip() + '%' if opt == 'all': interface_objs = db.query(Interface_test).filter( or_(Interface_test.user_id == user_obj.id, Interface_test.interface_type == 'public'), Interface_test.interface_name.like(search_content)) elif opt == 'project': project_objs = db.query(Project).filter( Project.project_name.like(search_content)).all() project_ids = [] for obj in project_objs: project_ids.append(obj.id) interface_objs = db.query(Interface_test).filter( Interface_test.project_id.in_(project_ids)) elif opt == 'public': interface_objs = db.query(Interface_test).filter( Interface_test.interface_type == 'public', Interface_test.interface_name.like(search_content)) elif opt == 'general': interface_objs = db.query(Interface_test).filter( Interface_test.user_id == user_obj.id, Interface_test.interface_type == 'general', Interface_test.interface_name.like(search_content)) # 倒序 interface_objs = interface_objs.order_by(Interface_test.id.desc()) data_sum = interface_objs.count() page = Paging(request, request.args.get('page', 1), data_sum, show_num=3) # 取数据 interface_objs = interface_objs[page.start:page.end] return render_template('interface_test.html', interface_objs=interface_objs, page=page, now_user_id=user_obj.id)
def get_my_use_case(): user_id = session.get('user_id') project_id = request.args.get('project_id') db = get_db() objs = db.query(Use_case).filter(Use_case.user_id == user_id, Use_case.project_id == project_id).all() response_data = [] for obj in objs: response_data.append({'id': obj.id, 'data': obj.name}) logger.debug('自己所有的用例数据: %s' % response_data) return jsonify(response_data)
def get_project_data(): db = get_db() project_objs = db.query(Project).all() data = [] for obj in project_objs: data.append({ 'id': obj.id, 'project_name': obj.project_name, 'project_description': obj.project_description }) return jsonify(data)
def delete(self, interface_test_id): result_id = interface_test_id db = get_db() try: db.query(Interface_test_result).filter( Interface_test_result.id == result_id).delete() db.commit() except Exception as error: db.rollback() logger.error('删除接口测试结果失败:%s' % error) return {'error': '删除失败!'}, 500 return {}, 204
def reset_pwd(): ret = {'flag': 0} # 验证验证码 if session['code'] != request.form.get('code').strip(): ret['flag'] = 1 ret['error_info'] = '验证码有误!' else: new_pwd = get_md5(session.get('temp_username'), request.form.get('new_pwd')) # 修改密码 db = get_db() db.query(Userinfo).filter(Userinfo.id == session.get('temp_user_id')).update({'password': new_pwd}) db.commit() return jsonify(ret)
def get_use_case_step(): # 获取操作数据库的句柄 db = get_db() # 获取所有的步骤 objs = db.query(Use_case_step).order_by(Use_case_step.id.asc()).all() # 进行格式化 step_data = {} for obj in objs: step_data[obj.step_method_name] = { 'step_name': obj.step_name, 'step_length': obj.step_length } logger.debug('获取步骤选项数据: %s' % step_data) return jsonify(step_data)
def get(self): db = get_db() user_id = session.get('user_id') use_case_id = request.args.get('use_case_id') # 查用例数据 uc_obj = db.query(Use_case).filter(Use_case.id == use_case_id).first() # 生成sql命令,查询该用户该用例的执行结果 result_objs = db.query(Use_case_result).filter(Use_case_result.use_case_id == use_case_id, Use_case_result.user_id == user_id) # 获取数据量 data_sum = result_objs.count() page = Paging(request, request.args.get('page', 1), data_sum, show_num=10) # 获取数据 result_objs = result_objs[page.start: page.end] return render_template('use_case_result.html', result_objs=result_objs, uc_obj=uc_obj, page=page)
def get_crontab_data(crontab_id): if crontab_id is None: return {'error': 'not found.'}, 404 dic = {} db = get_db() obj = db.query(Crontab).filter(Crontab.id == crontab_id).first() dic['task_name'] = obj.task_name dic['project_id'] = obj.project_id dic['test_type'] = obj.test_type dic['test_data_id'] = obj.test_data_id dic['task_type'] = obj.task_type dic['execute_time'] = obj.execute_time dic['task_description'] = obj.task_description return dic
def put(self): ret = {'flag': 0} form = UseCaseForm() # 判断提交的内容 if not form.validate_on_submit(): # 没通过返回错误提示信息 ret = form.errors ret['flag'] = 1 return jsonify(ret) # form认证通过 # 查找用户id db = get_db() # 格式化出保存的数据 data = request.form.to_dict() data.pop('csrf_token') edit_id = data.pop('edit_use_case_id') # print(data, edit_id) # 如果是公共用例的检测重名 if data['uc_type'] == 'public': if check_public_uc_name(data): ret['flag'] = 2 ret['error_info'] = "编辑的用例与公共用例重名" return jsonify(ret) # 更新数据 # 1.修改步骤数据(修改步骤表用例的id,由于有关联所以不能删) # 修改uc_id db.query(Step_detail).filter(Step_detail.uc_id == edit_id).update( {'delete_status': 1}) step_data = [] # 添加新的步骤数据,进行关联 for step in data.pop('params').split('||'): temp = step.split('@@') execute = int(temp[-1]) step_data.append( Step_detail(uc_id=edit_id, params=step, execute=execute)) save_data_to_db(db, step_data) # 2.修改用例数据 db.query(Use_case).filter(Use_case.id == edit_id).update(data) # 数据保存至硬盘 db.commit() return jsonify(ret)
def get_use_case_step_data(): db = get_db() uc_id = request.args.get('use_case_id') use_case_obj = db.query(Use_case).filter(Use_case.id == uc_id).first() step_objs = db.query(Step_detail).filter( Step_detail.uc_id == uc_id, Step_detail.delete_status == 0).all() data = { 'name': use_case_obj.name, 'project_id': use_case_obj.project_id, 'uc_type': use_case_obj.uc_type, 'desc': use_case_obj.desc, 'step': [] } for obj in step_objs: data['step'].append(obj.params) return jsonify(data)
def add_uc_data(data): db = get_db() params = data.pop('params') # 实例用例对象 use_case_obj = Use_case(**data) use_case_obj.uc2step_detail = [] # 实例用例步骤数据 if params != '': many_param = params.split('||') for param in many_param: temp = param.split('@@') execute = int(temp[-1]) use_case_obj.uc2step_detail.append(Step_detail(params=param, execute=execute)) # 保存用例数据至数据库 save_data_to_db(db, [use_case_obj])
def delete(self): ret = {'flag': 0} db = get_db() user_id = session.get('user_id') use_result_id = request.form.get('use_result_id') # 删除执行结果 # 1.删除result_step表的内容 del_db_data(db, db.query(Result_step).filter(Result_step.uc_result_id == use_result_id)) # 2.删除use_case_result表的内容 result = del_db_data(db, db.query(Use_case_result).filter(Use_case_result.id == use_result_id)) # 删除会返回,删除了几条符合的结果,如果结果为0表示就没找到这条用例 if result == 0: ret['flag'] = 1 ret['error_info'] = '删除失败' return jsonify(ret)
def check_request_data(self, crontab_data): db = get_db() # 验证名称,是否不为空 if crontab_data['task_name'].strip() == '': return False, {'error': '定时任务名称不能为空'}, 422 # 验证名称是否重名 if db.query(Crontab).filter(Crontab.task_name == crontab_data['task_name']).first(): return False, {'error': '定时任务重名!'}, 422 # 验证是否有这些测试数据 if crontab_data['test_type'] == 'interface_test': if not db.query(Interface_test).filter(Interface_test.id == crontab_data['test_data_id'], Interface_test.user_id == crontab_data['user_id']).first(): return False, {'error': '请求数据有误!'}, 422 elif crontab_data['test_type'] == 'use_case_test': if not db.query(Use_case).filter(Use_case.id == crontab_data['test_data_id'], Use_case.user_id == crontab_data['user_id']).first(): return False, {'error': '请求数据有误!'}, 422 return True, {}, 200
def post(self): db = get_db() status_code = 201 ret = {} data = request.form.to_dict() # 验证项目名称 flag, error = self.check_project_name(db, data) if not flag: return {'error': error}, 422 # 验证项目描述 flag, error = self.check_project_description(data) if not flag: return {'error': error}, 422 # 添加项目数据 data['user_id'] = session.get('user_id') save_data_to_db(db, [Project(**data)]) return ret, status_code
def get(self): opt = request.args.get('opt') search_content = request.args.get('search_content') db = get_db() user_id = session.get('user_id') # user_obj = db.query(Userinfo).filter(Userinfo.id == user_id).first() # 查询数据,获取数据总数,放置分页器 if not opt: crontab_objs = db.query(Crontab).filter(Crontab.user_id == user_id) else: search_content = '%' + search_content.strip() + '%' if opt == 'all': crontab_objs = db.query(Crontab).filter(Crontab.user_id == user_id) elif opt == 'project': project_obj = db.query(Project).filter(Project.project_name.like(search_content)).first() crontab_objs = db.query(Crontab).filter(Crontab.user_id == user_id, Crontab.project_id == project_obj.id) elif opt == 'task_name': crontab_objs = db.query(Crontab).filter(Crontab.user_id == user_id, Crontab.task_name.like(search_content)) # 倒序 crontab_objs = crontab_objs.order_by(Crontab.id.desc()) data_sum = crontab_objs.count() page = Paging(request, request.args.get('page', 1), data_sum, show_num=5) # 取数据 crontab_objs = crontab_objs[page.start: page.end] # 初始化一下数据 for obj in crontab_objs: if obj.test_type == 'interface_test': inter_obj = db.query(Interface_test).filter(Interface_test.id == obj.test_data_id).first() if inter_obj: obj.test_data = inter_obj.interface_name elif obj.test_type == 'use_case': usecase_obj = db.query(Use_case).filter(Use_case.id == obj.test_data_id).first() if usecase_obj: obj.test_data = usecase_obj.name return render_template('crontab.html', crontab_objs=crontab_objs, page=page, now_user_id=user_id)
def put(self): interface_test_data = json.loads(request.data) logger.debug('接口测试的更新数据提交内容: %s' % interface_test_data) edit_interface_test_id = interface_test_data.pop( 'edit_interface_test_id') request_params = interface_test_data.pop('request_params') header_params = interface_test_data.pop('header_params') interface_test_data['user_id'] = session.get('user_id') # 验证数据 # 更新数据 db = get_db() try: # (1) 更新接口测试数据 db.query(Interface_test).filter( Interface_test.id == edit_interface_test_id).update( interface_test_data) # (2) 删除旧的接口参数数据 db.query(Params).filter( Params.interface_test_id == edit_interface_test_id).delete() # (3) 添加新的接口参数数据 temp_obj = [] for dic in request_params: dic['interface_test_id'] = edit_interface_test_id temp_obj.append(Params(**dic)) for dic in header_params: dic['interface_test_id'] = edit_interface_test_id dic['params_type'] = 'header' temp_obj.append(Params(**dic)) db.add_all(temp_obj) # (4) 提交 db.commit() except Exception as error: logger.error('更新接口数据出错: %s' % error) db.rollback() return {'error': '编辑有误!'}, 500 return {}, 201
def alter_email(): ret = {'flag': 0} user_id = session.get('user_id') email = request.form.get('email') send_mail = int(request.form.get('send_mail')) # 修改邮箱 db = get_db() if email != '': db.query(Userinfo).filter(Userinfo.id == user_id).update({'email': email, 'send_mail': send_mail}) # 修改cookie response = make_response(jsonify(ret)) response.set_cookie('email', email) return response else: db.query(Userinfo).filter(Userinfo.id == user_id).update({'send_mail': send_mail}) db.commit() return jsonify(ret)