def get(self): session = Session() try: args = parser.parse_args() id, page = args["id"], args["page"] case_list = [] try: all_rets, page_rets, pages = get_page(page, session) for case in page_rets: parsed_case = parse_case_body(case, session) parsed_case["index"] = all_rets.index(case) + 1 parsed_case["id"] = case.id case_list.append(parsed_case) except Exception as e: try: session.rollback() except Exception as e: pass error_decription = "获取case数据失败!\n" error_location = traceback.format_exc() mylogger.error(error_decription + error_location) raise e page_previous, page_next = None, None if page > 1: page_previous = page - 1 if page + 1 <= pages: page_next = page + 1 project = session.query(Project).filter_by(id=id).first() rst = make_response( jsonify({ "success": True, "msg": "", "caseList": case_list, "projectInfo": { "name": project.name, "desc": project.desc }, "page": { "page_now": page, "page_previous": page_previous, "page_next": page_next } })) return rst except Exception as e: try: session.rollback() except Exception as error: pass mylogger.error("获取CASE分页数据失败!\n") rst = make_response( jsonify({ "success": False, "msg": "获取CASE分页数据失败!" + str(e) })) return rst finally: session.close()
def patch(self): args = parser.parse_args() apiForm = args["api_obj"] api_id = apiForm["id"] session = Session() try: api = session.query(API).filter_by(id=api_id).first() step = session.query(StepCase).filter_by( api_name=api.api_func).first() if step: rst = make_response( jsonify({ "success": False, "msg": "此API已被TestStep所引用,不能被编辑。\n编辑前请先删除引用此API的TestStep" })) return rst except Exception as e: session.rollback() finally: session.close() api = make_format(apiForm) status, msg = curd.update_api(api_id, api) rst = make_response(jsonify({"success": status, "msg": msg})) return rst
def delete(self): args = parser.parse_args() api_id = args["api_id"] session = Session() try: api = session.query(API).filter_by(id=api_id).first() step = session.query(StepCase).filter_by( api_name=api.api_func).first() if step: rst = make_response( jsonify({ "success": False, "msg": "此API已被TestStep所引用,不能被删除。\n删除前请先删除引用此API的TestStep" })) return rst except Exception as e: session.rollback() finally: session.close() status, msg = curd.delete_api( api_id) # 这句会涉及数据库操作,但session是curd中的,对应出错时在那边进行回滚 rst = make_response(jsonify({"success": status, "msg": msg})) return rst
def get(self, project_id): session = Session() try: project = session.query(Project).filter_by(id=project_id).first() test_apis = session.query(API).filter_by( project_id=project_id).all() test_cases = session.query(TestCase).filter_by( project_id=project_id).all() test_reports = session.query(Report).filter_by( project_id=project_id).all() detail = [{ "length": "{}个接口".format(len(test_apis)), "desc": "接口总数", "routerName": "APIView" }, { "length": "{}个用例".format(len(test_cases)), "desc": "用例总数", "routerName": "AutoTest" }, { "length": "{}套环境".format(0), "desc": "环境总数", "routerName": "GlobalEnv" }, { "length": "{}个报告".format(len(test_reports)), "desc": "报告总数", "routerName": "Reports" }] rst = make_response( jsonify({ "success": True, "msg": "", "detail": detail, "name": project.name, "desc": project.desc })) return rst except Exception as e: try: session.rollback() except Exception as error: pass return make_response( jsonify({ "success": False, "msg": "获取项目详情失败!" })) finally: session.close()
def login(): session = Session() try: username = request.json.get('username') password = request.json.get('password') obj = session.query(Auth).filter_by(username=username).first() if not obj: return jsonify({'success': False, 'msg': '未找到该用户,请重新输入或注册账号!'}) if obj.verify_password(password): token = generate_token(username) return jsonify({'success': True, 'token': token, 'msg': '用户登录成功!', 'user': username}) else: return jsonify({'success': False, 'msg': '密码校验失败,请重新输入!'}) except Exception as e: pass finally: session.close()
def post(self): args = parser.parse_args() args["owner"] = args["responsible"] session = Session() try: obj = session.query(Project).filter_by(name=args["name"]).first() except Exception as e: session.rollback() rst = make_response(jsonify({"success": False, "msg": "项目新增失败!"})) return rst finally: session.close() if obj is not None: rst = make_response( jsonify({ "success": False, "msg": "项目名称已存在,请重新编辑!" })) return rst if args["url"] == "" and args["file"] == {}: status, msg = curd.add_project(args) else: status, msg = execute(args) rst = make_response(jsonify({"success": status, "msg": msg})) return rst
def get(self): session = Session() try: args = parser.parse_args() project_id = args["project_id"] BaseURLList = [] all_rets = session.query(BaseURL).filter_by( project_id=project_id).all() for index, base_url in enumerate(all_rets): BaseURLList.append({ "index": index + 1, "id": base_url.id, "name": base_url.name, "value": base_url.value }) rst = make_response( jsonify({ "success": True, "BaseURLList": BaseURLList })) return rst except Exception as e: try: session.rollback() except Exception as error: pass rst = make_response(jsonify({"success": False, "msg": str(e)})) return rst finally: session.close()
def post(self): args = parser.parse_args() apiForm = args["api_obj"] api_func, project_id = apiForm["def"], apiForm["project_id"] if re.match(r'^\w+(?:\(\)|\(\$data\))$', api_func) is None: rst = make_response( jsonify({ "success": False, "msg": "API调用格式不正确,请重新编辑" })) return rst session = Session() try: obj = session.query(API).filter( API.api_func == api_func and API.project_id == project_id).first() except Exception as e: session.rollback() rst = make_response(jsonify({"success": False, "msg": "API新增失败!"})) return rst finally: session.close() if obj is not None: rst = make_response( jsonify({ "success": False, "msg": "该项目中已存在同名API调用!!!" })) return rst api = make_format(apiForm) status, msg = curd.add_api(apiForm["project_id"], api) rst = make_response(jsonify({"success": status, "msg": msg})) return rst
def get(self): args = parser.parse_args() variable_id = int(args["id"]) session = Session() try: variable = session.query(VariablesLocal).filter_by( id=variable_id).first() rst = make_response( jsonify({ "success": True, "id": variable.id, "step_id": variable.config_id, "key": variable.key, "value": variable.value })) return rst except Exception as e: session.rollback() return make_response( jsonify({ "success": False, "msg": "sql error ==> rollback!" + str(e) })) finally: session.close()
def get(self): args = parser.parse_args() parameter_id = int(args["id"]) session = Session() try: parameter = session.query(Parameters).filter_by( id=parameter_id).first() rst = make_response( jsonify({ "success": True, "id": parameter.id, "config_id": parameter.config_id, "key": parameter.key, "value": parameter.value, "value_type": parameter.value_type })) return rst except Exception as e: session.rollback() return make_response( jsonify({ "success": False, "msg": "sql error ==> rollback!" + str(e) })) finally: session.close()
def register(): session = Session() try: username = request.json.get('username') password = request.json.get('password') email = request.json.get('email') obj = session.query(Auth).filter_by(username=username).first() if obj: return jsonify({'success': False, 'msg': '用户名已存在,请重新注册!'}) else: save = Auth(username=username, email=email) save.hash_password(password) # 调用密码加密方法 session.add(save) session.commit() return jsonify({'success': True, 'msg': '用户注册成功!'}) except Exception as e: pass finally: session.close()
def get(self): args = parser.parse_args() id = args["id"] case_list = [] session = Session() try: try: all_rets = session.query(TestCase).filter_by( project_id=id).all() except Exception as e: error_decription = "获取case_list数据失败!\n" error_location = traceback.format_exc() mylogger.error(error_decription + error_location) raise e for case in all_rets: parsed_case = parse_case_body(case, session) parsed_case["index"] = all_rets.index(case) + 1 parsed_case["id"] = case.id case_list.append(parsed_case) project = session.query(Project).filter_by(id=id).first() rst = make_response( jsonify({ "success": True, "msg": "", "caseList": case_list, "projectInfo": { "name": project.name, "desc": project.desc } })) return rst except Exception as e: try: session.rollback() except Exception as error: pass mylogger.error("获取CASEList失败!\n") rst = make_response( jsonify({ "success": False, "msg": "操作过于频繁,请稍后重试!" + str(e) })) return rst finally: session.close()
def post(self, report_id): """作为邮件发送""" session = Session() try: args = parser.parse_args() mailForm = args["mail"] mail_to = mailForm["to"] if not check_waykichain_mail(mail_to): rst = make_response(jsonify({"success": False, "msg": "发送方邮件格式不正确,请重新编辑!"})) return rst if mailForm["more"]: mail_more = mailForm["more"].split(";") for item in mail_more: if not check_waykichain_mail(item): rst = make_response(jsonify({"success": False, "msg": "抄送方存在邮件格式不正确,请重新编辑!"})) return rst mail_list = [mail_to] + mail_more else: mail_list = [mail_to] report_obj = session.query(Report).filter(Report.id == mailForm["report_id"]).first() config = { "mail_from": mailForm["from"], "password": mailForm["password"], "mail_to": mail_list, "render_content": load_report(report_obj.render_content), "report_name": "{}_{}.html".format(report_obj.name, report_obj.current_time), "description": mailForm["description"] } mail = MailSend(config) mail.send() make_response(jsonify({"success": True, "msg": "邮件发送成功!"})) except Exception as e: rst = make_response(jsonify({"success": False, "msg": "邮件发送失败!" + str(e)})) return rst finally: session.close()
def get(self, report_id): session = Session() try: report = session.query(Report).filter_by(id=report_id).first() render_content = load_report(report.render_content) rst = make_response(jsonify({"success": True, "msg": "", "render_content": render_content })) return rst except Exception as e: session.rollback() return make_response(jsonify({"success": False, "msg": "sql error ==> rollback!" + str(e)})) finally: session.close()
def get(self): session = Session() try: args = parser.parse_args() id, page = args["id"], args["page"] var_envList = [] all_rets, page_rets, pages = get_page(page, id, session) for var_env in page_rets: index = all_rets.index(var_env) + 1 var_envList.append({ "index": index, "id": var_env.id, "key": var_env.key, "value": var_env.value }) page_previous, page_next = None, None if page > 1: page_previous = page - 1 if page + 1 <= pages: page_next = page + 1 project = session.query(Project).filter_by(id=id).first() rst = make_response( jsonify({ "success": True, "var_envList": var_envList, "projectInfo": { "name": project.name, "desc": project.desc }, "page": { "page_now": page, "page_previous": page_previous, "page_next": page_next } })) return rst except Exception as e: try: session.rollback() except Exception as error: pass rst = make_response(jsonify({"success": False, "msg": str(e)})) return rst finally: session.close()
def get(self): args = parser.parse_args() extract_id = int(args["id"]) session = Session() try: extract = session.query(Extract).filter_by(id=extract_id).first() rst = make_response( jsonify({ "success": True, "id": extract.id, "config_id": extract.step_id, "key": extract.key, "value": extract.value })) return rst except Exception as e: try: session.rollback() except Exception as error: pass return make_response(jsonify({"success": False, "msg": str(e)})) finally: session.close()
def dump(self): # dumper_file = DumpFile(self.config, self.apis, self.testcases) # dumper_file.dump_to_file() if self.config["project"] is not None: print("in dump config:", self.config) session = Session() try: dumper_db = DumpDB(self.apis, self.testcases, session) dumper_db.dump_to_db(self.config) except Exception as e: try: session.rollback() except Exception as error: pass error_decription = "Dump Project To DB失败!\n" error_location = traceback.format_exc() mylogger.error(error_decription + error_location) raise e finally: session.close()
def get(self): session = Session() try: args = parser.parse_args() # print("args: ", args) id, page, owner = args["id"], args["page"], args["owner"] report_list = [] all_rets, page_rets, pages = get_page(page, id, session) for report in page_rets: index = all_rets.index(report) + 1 item = {"index": index, "id": report.id, "name": report.name, "current_time": report.current_time, "tester": report.tester, "description": report.description} item.update(json.loads(report.result_stastic)) report_list.append(item) page_previous, page_next = None, None if page > 1: page_previous = page - 1 if page + 1 <= pages: page_next = page + 1 project = session.query(Project).filter_by(id=id).first() auth = session.query(Auth).filter_by(username=owner).first() rst = make_response(jsonify({ "success": True, "reportList": report_list, "owner_email": auth.email, "projectInfo": {"name": project.name, "desc": project.desc}, "page": {"page_now": page, "page_previous": page_previous, "page_next": page_next}})) return rst except Exception as e: rst = make_response(jsonify({"success": False, "msg": e})) return rst finally: session.close()
def run_test(): session = Session() try: # 解析参数 case_list = request.json.get('case_list') project_id = request.json.get('project_id') base_url = request.json.get('base_url') cwd = os.getcwd() testproject_dir = os.path.join(os.path.join(cwd, r"SwaggerToCase"), 'TestProject') testcases_dir = os.path.join(testproject_dir, r"testcases") testapi_dir = os.path.join(testproject_dir, r"api") # 清空testcases_dir和testapi_dir shutil.rmtree(testcases_dir) shutil.rmtree(testapi_dir) os.mkdir(testcases_dir) os.mkdir(testapi_dir) project_obj = session.query(Project).filter_by(id=project_id).first() project_name = project_obj.name config = {} config["testcase_dir"] = os.path.join(testcases_dir, project_name) config["api_file"] = os.path.join(testapi_dir, project_name) config["file_type"] = "YAML" config["env_file"] = os.path.join(testproject_dir, ".env") config["code_file"] = os.path.join(testproject_dir, "debugtalk.py") case_curd = TestCaseCURD() report_curd = ReportCURD() case_ids, test_apis, test_cases = case_curd.retrieve_part_cases( case_list) dumper = DumpFile(config, test_apis, test_cases) dumper.dump_api_file() # 写入api文件 dumper.dump_testcases_files() # 写入testcase文件 vars_env = session.query(VariablesEnv).filter_by( project_id=project_id).all() # env_content = "" # for var in vars_env: # key, value = var.key, var.value # env_content += "{}={}\n".format(key, value) # dumper.dump_env_file(env_content) # 写入env文件 code_content = session.query(DebugTalk).filter_by( project_id=project_id).first().code # # import os # # username = os.environ["username"] # # password = os.environ["password"] # # base_url = os.environ["base_url"] # apend_content = "\nimport os\n" # for var in vars_env: # key, value = var.key, var.value # apend_content += '{} = os.environ["{}"]\n'.format(key, key) # dumper.dump_code_file(code_content + apend_content) # 写入debugtalk文件 apend_content = "\n\n" for var in vars_env: key, value = var.key, var.value apend_content += '{} = "{}"\n'.format(key, value) apend_content += '{} = "{}"\n'.format("base_url", base_url) dumper.dump_code_file(code_content + apend_content) # 写入debugtalk文件 try: report_list = run(testproject_dir, [project_name]) except Exception as e: return jsonify({'success': False, 'msg': '用例执行失败!' + str(e)}) # raise RunTestError('...') for report in report_list: file_name, current_time, render_content, result_stastic = report report_dict = { "project_id": project_id, "name": file_name, "current_time": current_time, "tester": project_obj.owner, "description": "", "render_content": render_content, "result_stastic": json.dumps(result_stastic) } report_curd.add_report(report_dict) file_name, current_time, render_content, result_stastic = report_list[ 0] return jsonify({ 'success': True, 'msg': '用例执行成功!', "render_content": render_content }) except Exception as e: return jsonify({'success': False, 'msg': '用例执行失败!' + str(e)}) finally: session.close()
def get(self): session = Session() try: args = parser.parse_args() if args["page"] is not None: id, page = args["id"], args["page"] api_list = [] try: all_rets_reverse, page_rets, pages = get_page( page, id, session) except Exception as e: # 需要中间记录一下错误,可以按照下列做法 error_decription = "获取API分页数据失败!\n" error_location = traceback.format_exc() mylogger.error(error_decription + error_location) raise e for api in page_rets: api_body = json.loads(api.body) request = api_body["api"]["request"] if "params" not in request: request["params"] = {} if "headers" not in request: request["headers"] = {} if "json" not in request: request["json"] = "" if "data" not in request: request["data"] = "" parsed_api = parse_api_body(api_body) parsed_api["index"] = all_rets_reverse.index(api) + 1 parsed_api["id"] = api.id if parsed_api["json"]: parsed_api["body_type"] = "Json" elif parsed_api["data"]: parsed_api["body_type"] = "Form" else: parsed_api["body_type"] = "Null" api_list.append(parsed_api) page_previous, page_next = None, None if page > 1: page_previous = page - 1 if page + 1 <= pages: page_next = page + 1 project = session.query(Project).filter_by(id=id).first() rst = make_response( jsonify({ "success": True, "msg": "", "apiList": api_list, "projectInfo": { "name": project.name, "desc": project.desc }, "page": { "page_now": page, "page_previous": page_previous, "page_next": page_next } })) return rst else: project_id = args["id"] try: apis_obj = session.query(API).filter_by( project_id=project_id).all() except Exception as e: # 需要中间记录一下错误,可以按照下列做法 error_decription = "获取APIL所有数据失败!\n" error_location = traceback.format_exc() mylogger.error(error_decription + error_location) raise e api_list = [] for api in apis_obj: api_list.append(api.api_func) rst = make_response( jsonify({ "success": True, "msg": "", "api_list": api_list })) return rst except Exception as e: # 捕捉上面出错继续上抛的异常(做好log记录,便于异常时候排查)和其它可能的异常 # 出错时,及时回滚数据库 try: session.rollback() # 这里的Exception不一定时数据库错误,盲目执行会报错 except Exception as error: pass mylogger.error("获取APIList失败!\n") rst = make_response( jsonify({ "success": False, "msg": "获取APIList失败!" + str(e) })) return rst finally: session.close()
def get(self): session = Session() try: parser = reqparse.RequestParser() parser.add_argument('owner', type=str) parser.add_argument('page', type=int) args = parser.parse_args() owner, page = args["owner"], args["page"] project_list = [] all_rets_reverse, page_rets, pages = get_page(page, owner, session) for pro in page_rets: test_apis = session.query(API).filter_by( project_id=pro.id).all() test_cases = session.query(TestCase).filter_by( project_id=pro.id).all() test_reports = session.query(Report).filter_by( project_id=pro.id).all() test_baseurls = session.query(BaseURL).filter_by( project_id=pro.id).all() index = all_rets_reverse.index(pro) + 1 project_list.append({ "id": pro.id, "index": index, "name": pro.name, "desc": pro.desc, "responsible": pro.owner, "mode": pro.mode, "len_api": len(test_apis), "len_case": len(test_cases), "len_report": len(test_reports), "len_baseurl": len(test_baseurls), }) page_previous, page_next = None, None if page > 1: page_previous = page - 1 if page + 1 <= pages: page_next = page + 1 rst = make_response( jsonify({ "success": True, "msg": "projectList获取成功!", "results": project_list, "page": { "page_now": page, "page_previous": page_previous, "page_next": page_next } })) return rst except Exception as e: try: session.rollback() except Exception as error: pass mylogger.error("projectList获取失败!\n" + str(e)) return make_response( jsonify({ "success": False, "msg": "projectList获取失败,请重新刷新页面!" + str(e) })) finally: session.close()