コード例 #1
0
    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()
コード例 #2
0
 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
コード例 #3
0
 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
コード例 #4
0
 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()
コード例 #5
0
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()
コード例 #6
0
    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
コード例 #7
0
    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()
コード例 #8
0
 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
コード例 #9
0
 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()
コード例 #10
0
 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()
コード例 #11
0
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()
コード例 #12
0
    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()
コード例 #13
0
 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()
コード例 #14
0
 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()
コード例 #15
0
 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()
コード例 #16
0
 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()
コード例 #17
0
 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()
コード例 #18
0
 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()
コード例 #19
0
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()
コード例 #20
0
    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()
コード例 #21
0
 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()