Beispiel #1
0
def run_api(request):
    """ run api by body
    """
    name = request.data.pop('config')
    host = request.data.pop("host")
    api = Format(request.data)
    api.parse()

    config = None
    if name != '请选择':
        try:
            config = eval(
                models.Config.objects.get(name=name,
                                          project__id=api.project).body)

        except ObjectDoesNotExist:
            logger.error("指定配置文件不存在:{name}".format(name=name))
            return Response(config_err)

    if host != "请选择":
        host = models.HostIP.objects.get(
            name=host, project__id=api.project).value.splitlines()
        api.testcase = parse_host(host, api.testcase)

    summary = loader.debug_api(api.testcase,
                               api.project,
                               name=api.name,
                               config=parse_host(host, config),
                               user=request.user)

    return Response(summary)
Beispiel #2
0
def run_test(request):
    """debug single test
    {
        host: str
        body: dict
        project :int
        config: null or dict
    }
    """

    body = request.data["body"]
    config = request.data.get("config", None)
    project = request.data["project"]
    host = request.data["host"]

    if host != "请选择":
        host = models.HostIP.objects.get(name=host,
                                         project=project).value.splitlines()

    if config:
        config = eval(
            models.Config.objects.get(project=project,
                                      name=config["name"]).body)

    summary = loader.debug_api(parse_host(host, loader.load_test(body)),
                               project,
                               name=body.get('name', None),
                               config=parse_host(host, config),
                               user=request.user)

    return Response(summary)
def build_testsuite(project: int, config_id: int = 0, testcase_tag: int = 1):
    """
    组装可运行的用例
    """
    cases = list(
        models.Case.objects.filter(project__id=project,
                                   tag=testcase_tag).order_by('id').values(
                                       'id', 'name'))
    test_sets = []
    config_list = []
    host = '请选择'
    reload_config = None
    if config_id:
        # 前端有指定config,会覆盖用例本身的config
        reload_config = eval(models.Config.objects.get(id=config_id).body)
    for case in cases:
        test_list = models.CaseStep.objects.filter(
            case__id=case["id"]).order_by("step").values("body")
        testcase_list = []
        for content in test_list:
            body = eval(content["body"])
            if body["request"].get('url'):
                testcase_list.append(parse_host(host, body))
            elif body["request"].get('base_url'):
                if reload_config is None:
                    config = eval(
                        models.Config.objects.get(name=body["name"],
                                                  project__id=project).body)
                else:
                    config = reload_config
        config_list.append(parse_host(host, config))
        test_sets.append(testcase_list)
    return {'suite': test_sets, 'obj': cases, 'config': config_list}
Beispiel #4
0
def run_testsuite(request):
    """debug testsuite
    {
        name: str,
        body: dict
        host: str
    }
    """
    body = request.data["body"]
    project = request.data["project"]
    name = request.data["name"]
    host = request.data["host"]

    test_case = []
    config = None

    if host != "请选择":
        host = models.HostIP.objects.get(name=host,
                                         project=project).value.splitlines()

    for test in body:
        test = loader.load_test(test, project=project)
        if "base_url" in test["request"].keys():
            config = test
            continue

        test_case.append(parse_host(host, test))

    summary = loader.debug_api(test_case,
                               project,
                               name=name,
                               config=parse_host(host, config),
                               user=request.user)

    return Response(summary)
Beispiel #5
0
def run_testsuite_pk(request, **kwargs):
    """run testsuite by pk
        {
            project: int,
            name: str,
            host: str
        }
    """
    pk = kwargs["pk"]

    test_list = models.CaseStep.objects. \
        filter(case__id=pk).order_by("step").values("body")

    project = request.query_params["project"]
    name = request.query_params["name"]
    host = request.query_params["host"]

    test_case = []
    config = None

    if host != "请选择":
        host = models.HostIP.objects.get(name=host, project=project).value.splitlines()

    for content in test_list:
        body = eval(content["body"])

        if "base_url" in body["request"].keys():
            config = eval(models.Config.objects.get(name=body["name"], project__id=project).body)
            continue

        test_case.append(parse_host(host, body))

    summary = loader.debug_api(test_case, project, name=name, config=parse_host(host, config))

    return Response(summary)
Beispiel #6
0
def run_suite_tree(request):
    """run suite by tree
    {
        project: int
        relation: list
        name: str
        async: bool
        host: str
    }
    """
    # order by id default
    project = request.data['project']
    relation = request.data["relation"]
    back_async = request.data["async"]
    report = request.data["name"]
    host = request.data["host"]

    if host != "请选择":
        host = models.HostIP.objects.get(name=host,
                                         project=project).value.splitlines()

    test_sets = []
    suite_list = []
    config_list = []
    for relation_id in relation:
        suite = list(
            models.Case.objects.filter(
                project__id=project,
                relation=relation_id).order_by('id').values('id', 'name'))
        for content in suite:
            test_list = models.CaseStep.objects. \
                filter(case__id=content["id"]).order_by("step").values("body")

            testcase_list = []
            config = None
            for content in test_list:
                body = eval(content["body"])
                if "base_url" in body["request"].keys():
                    config = eval(
                        models.Config.objects.get(name=body["name"],
                                                  project__id=project).body)
                    continue
                testcase_list.append(parse_host(host, body))
            # [[{scripts}, {scripts}], [{scripts}, {scripts}]]
            config_list.append(parse_host(host, config))
            test_sets.append(testcase_list)
            suite_list = suite_list + suite

    if back_async:
        tasks.async_debug_suite.delay(test_sets, project, suite_list, report,
                                      config_list)
        summary = loader.TEST_NOT_EXISTS
        summary["msg"] = "用例运行中,请稍后查看报告"
    else:
        summary = loader.debug_suite(test_sets, project, suite_list,
                                     config_list)

    return Response(summary)
Beispiel #7
0
def run_api_tree(request):
    """run api by tree
    {
        project: int
        relation: list
        name: str
        async: bool
        host: str
    }
    """
    # order by id default
    host = request.data["host"]
    project = request.data['project']
    relation = request.data["relation"]
    back_async = request.data["async"]
    name = request.data["name"]
    config = request.data["config"]

    config = None if config == '请选择' else eval(models.Config.objects.get(name=config, project__id=project).body)
    test_case = []

    temp_config = []
    temp_baseurl = ''
    if host != "请选择":
        host = models.HostIP.objects.get(name=host, project=project)
        host_info = json.loads(host.hostInfo)
        temp_config.extend(host_info["variables"])
        temp_baseurl = host.base_url if host.base_url else ''

    if config and host != "请选择":
        config.get("variables", []).extend(temp_config)
        if temp_baseurl:
            config["request"]["base_url"] = temp_baseurl
    if not config and host != "请选择":
        config = {
            "variables": temp_config,
            "request": {
                "base_url": temp_baseurl
            }
        }

    for relation_id in relation:
        api = models.API.objects.filter(project__id=project, relation=relation_id).order_by('id').values('body')
        for content in api:
            api = eval(content['body'])
            test_case.append(parse_host(host, api))

    if back_async:
        tasks.async_debug_api.delay(test_case, project, name, config=parse_host(host, config))
        summary = loader.TEST_NOT_EXISTS
        summary["msg"] = "接口运行中,请稍后查看报告"
    else:
        try:
            summary = loader.debug_api(test_case, project, config=parse_host(host, config))
        except Exception as e:
            return Response({'traceback': str(e)}, status=400)
    return Response(summary)
Beispiel #8
0
def run_api_tree(request):
    """run api by tree
    {
        project: int
        relation: list
        name: str
        async: bool
        host: str
    }
    """
    # order by id default
    host = request.data["host"]
    project = request.data['project']
    relation = request.data["relation"]
    back_async = request.data["async"]
    name = request.data["name"]
    config = request.data["config"]

    config = None if config == '请选择' else eval(
        models.Config.objects.get(name=config, project__id=project).body)
    test_case = []

    if host != "请选择":
        host = models.HostIP.objects.get(name=host,
                                         project=project).value.splitlines()

    for relation_id in relation:
        api = models.API.objects.filter(project__id=project,
                                        relation=relation_id,
                                        delete=0).order_by('id').values('body')
        for content in api:
            api = eval(content['body'])
            test_case.append(parse_host(host, api))

    if back_async:
        tasks.async_debug_api.delay(test_case,
                                    project,
                                    name,
                                    config=parse_host(host, config))
        summary = loader.TEST_NOT_EXISTS
        summary["msg"] = "接口运行中,请稍后查看报告"
    else:
        summary = loader.debug_api(test_case,
                                   project,
                                   name=f'批量运行{len(test_case)}条API',
                                   config=parse_host(host, config),
                                   user=request.user)

    return Response(summary)
Beispiel #9
0
def run_api_pk(request, **kwargs):
    """run api by pk and config
    """
    host = request.query_params["host"]
    api = models.API.objects.get(id=kwargs['pk'])
    name = request.query_params["config"]
    config = None if name == '请选择' else eval(models.Config.objects.get(name=name, project=api.project).body)

    test_case = eval(api.body)
    if host != "请选择":
        host = models.HostIP.objects.get(name=host, project=api.project).value.splitlines()
        test_case = parse_host(host, test_case)

    summary = loader.debug_api(test_case, api.project.id, config=parse_host(host, config))

    return Response(summary)
Beispiel #10
0
def run_api(request):
    """ run api by body
    """
    name = request.data.pop('config')
    host = request.data.pop("host")
    api = Format(request.data)
    api.parse()

    test_data = None
    if request.data["testDataExcel"] != '请选择' and request.data["testDataSheet"]:
        test_data = (request.data["testDataExcel"],
                     request.data["testDataSheet"])
    config = None
    if name != '请选择':
        try:
            config = eval(
                models.Config.objects.get(name=name,
                                          project__id=api.project).body)
        except ObjectDoesNotExist:
            logger.error("指定配置文件不存在:{name}".format(name=name))
            return Response(config_err)

    temp_config = []
    temp_baseurl = ''
    if host != "请选择":
        host = models.HostIP.objects.get(name=host, project=api.project)
        host_info = json.loads(host.hostInfo)
        temp_config.extend(host_info["variables"])
        temp_baseurl = host.base_url if host.base_url else ''

    if config and host != "请选择":
        config["variables"].extend(temp_config)
        if temp_baseurl:
            config["request"]["base_url"] = temp_baseurl
    if not config and host != "请选择":
        config = {
            "variables": temp_config,
            "request": {
                "base_url": temp_baseurl
            }
        }

    # if host != "请选择":
    #     try:
    #         host = models.HostIP.objects.get(name=host, project__id=api.project).value.splitlines()
    #         api.testcase = parse_host(host, api.testcase)
    #     except ObjectDoesNotExist:
    #         logger.error("指定域名不存在:{name}".format(name=host))
    try:
        summary = loader.debug_api(api.testcase,
                                   api.project,
                                   config=parse_host(host, config),
                                   test_data=test_data)
    except Exception as e:
        return Response({'traceback': str(e)}, status=400)
    return Response(summary)
Beispiel #11
0
def run_api_pk(request, **kwargs):
    """run api by pk and config
    """
    host = request.query_params["host"]
    api = models.API.objects.get(id=kwargs['pk'])
    name = request.query_params["config"]
    config = None if name == '请选择' else eval(
        models.Config.objects.get(name=name, project=api.project).body)
    test_case = eval(api.body)

    test_data = None
    if request.query_params["testDataExcel"] != '请选择' and request.query_params[
            "testDataSheet"]:
        test_data = (request.query_params["testDataExcel"],
                     request.query_params["testDataSheet"])

    temp_config = []
    temp_baseurl = ''
    if host != "请选择":
        host = models.HostIP.objects.get(name=host, project=api.project)
        host_info = json.loads(host.hostInfo)
        temp_config.extend(host_info["variables"])
        temp_baseurl = host.base_url if host.base_url else ''

    if config and host != "请选择":
        config["variables"].extend(temp_config)
        if temp_baseurl:
            config["request"]["base_url"] = temp_baseurl
    if not config and host != "请选择":
        config = {
            "variables": temp_config,
            "request": {
                "base_url": temp_baseurl
            }
        }
    # if host != "请选择":
    #     try:
    #         host = models.HostIP.objects.get(name=host, project=api.project).value.splitlines()
    #         test_case = parse_host(host, test_case)
    #     except ObjectDoesNotExist:
    #         logger.error("指定域名不存在:{name}".format(name=host))
    try:
        summary = loader.debug_api(test_case,
                                   api.project.id,
                                   config=parse_host(host, config),
                                   test_data=test_data)
    except Exception as e:
        return Response({'traceback': str(e)}, status=400)

    return Response(summary)
Beispiel #12
0
def schedule_debug_suite(*args, **kwargs):
    """定时任务
    """
    project = int(kwargs["project"])

    sample_summary = []
    if not args:
        raise ValueError('任务列表为空,请检查')
    for cases in args:
        case_kwargs = cases.get('kwargs', '')
        test_list = models.CaseStep.objects.filter(
            case__id=cases["id"]).order_by("step").values("body")
        if not test_list:
            raise ValueError('用例缺失,请假查')
        report_name = cases["name"]
        case_name = cases["name"]
        test_case = []
        config = None
        temp_config = []
        test_data = None
        temp_baseurl = ''
        g_host_info = ''
        if case_kwargs:
            report_name = case_kwargs["testCaseName"]
            if case_kwargs.get("excelTreeData", []):
                test_data = tuple(case_kwargs["excelTreeData"])
            if case_kwargs["hostInfo"] and case_kwargs["hostInfo"] != "请选择":
                g_host_info = case_kwargs["hostInfo"]
                host = models.HostIP.objects.get(name=g_host_info,
                                                 project__id=project)
                _host_info = json.loads(host.hostInfo)
                temp_config.extend(_host_info["variables"])
                temp_baseurl = host.base_url if host.base_url else ''

        for content in test_list:
            body = eval(content["body"])
            if "base_url" in body["request"].keys():
                config = eval(
                    models.Config.objects.get(name=body["name"],
                                              project__id=project).body)
                continue
            test_case.append(parse_host(g_host_info, body))

        if config and g_host_info not in ["请选择", '']:
            config["variables"].extend(temp_config)
            if temp_baseurl:
                config["request"]["base_url"] = temp_baseurl
        if not config and g_host_info not in ["请选择", '']:
            config = {
                "variables": temp_config,
                "request": {
                    "base_url": temp_baseurl
                }
            }

        summary = debug_api(test_case,
                            project,
                            name=case_name,
                            config=parse_host(g_host_info, config),
                            save=False,
                            test_data=test_data)
        summary["name"] = report_name
        sample_summary.append(summary)

    if sample_summary:
        summary_report = get_summary_report(sample_summary)
        save_summary(kwargs["task_name"], summary_report, project, type=3)
        is_send_email = control_email(sample_summary, kwargs)
        if is_send_email:
            sensitive_keys = kwargs.get('sensitive_keys', [])
            runresult = parser_runresult(sample_summary, sensitive_keys)

            peoject_name = models.Project.objects.get(id=project).name
            subject_name = peoject_name + ' - ' + kwargs["task_name"]
            if runresult["fail_task"] > 0:
                subject_name += " - 失败:" + ",".join(
                    [err_msg["proj"] for err_msg in runresult["error_list"]])
            else:
                subject_name += " - 成功!"
            html_conetnt = prepare_email_content(runresult, subject_name)
            send_file_path = prepare_email_file(summary_report)
            send_status = send_result_email(subject_name,
                                            kwargs["receiver"],
                                            kwargs["mail_cc"],
                                            send_html_content=html_conetnt,
                                            send_file_path=send_file_path)
            if send_status:
                print('邮件发送成功')
            else:
                print('邮件发送失败')
Beispiel #13
0
def run_suite_tree(request):
    """run suite by tree
    {
        project: int
        relation: list
        name: str
        async: bool
        host: str
    }
    """
    # order by id default
    try:
        project = request.data['project']
        relation = request.data["relation"]
        report_name = request.data["name"]
        host = request.data["host"]

        temp_config = []
        temp_baseurl = ''
        if host != "请选择":
            host = models.HostIP.objects.get(name=host, project=project)
            host_info = json.loads(host.hostInfo)
            temp_config.extend(host_info["variables"])
            temp_baseurl = host.base_url if host.base_url else ''

        test_sets = []
        suite_list = []
        config_list = []
        for relation_id in relation:
            suite = list(
                models.Case.objects.filter(
                    project__id=project,
                    relation=relation_id).order_by('id').values('id', 'name'))
            for content in suite:
                test_list = models.CaseStep.objects.filter(
                    case__id=content["id"]).order_by("step").values("body")

                testcase_list = []
                config = None
                for case_content in test_list:
                    body = eval(case_content["body"])
                    if "base_url" in body["request"].keys():
                        config = eval(
                            models.Config.objects.get(
                                name=body["name"], project__id=project).body)
                        continue
                    testcase_list.append(parse_host(host, body))
                # [[{scripts}, {scripts}], [{scripts}, {scripts}]]
                if config and host != "请选择":
                    config["variables"].extend(temp_config)
                    if temp_baseurl:
                        config["request"]["base_url"] = temp_baseurl
                if not config and host != "请选择":
                    config = {
                        "variables": temp_config,
                        "request": {
                            "base_url": temp_baseurl
                        }
                    }
                config_list.append(parse_host(host, config))
                test_sets.append(testcase_list)
                suite_list = suite_list + suite

        tasks.async_debug_suite.delay(test_sets, project, suite_list,
                                      report_name, config_list)
        summary = loader.TEST_NOT_EXISTS
        summary["msg"] = "用例运行中,请稍后查看报告"

        return Response(summary)
    except Exception as e:
        return Response({'traceback': str(e)}, status=400)
Beispiel #14
0
def run_testsuite_pk(request, **kwargs):
    """run testsuite by pk
        {
            project: int,
            name: str,
            host: str,
            testDataExcel: str
            testDataSheet: str
        }
    """
    pk = kwargs["pk"]
    test_list = models.CaseStep.objects.filter(
        case__id=pk).order_by("step").values("body")

    project = request.data["project"]
    name = request.data["name"]
    host = request.data["host"]
    back_async = request.data["async"]
    report_name = request.data["reportName"]

    test_data = None
    if request.data["testDataExcel"] != '请选择' and request.data["testDataSheet"]:
        test_data = (request.data["testDataExcel"],
                     request.data["testDataSheet"])

    test_case = []
    config = None

    temp_config = []
    temp_baseurl = ''
    if host != "请选择":
        host = models.HostIP.objects.get(name=host, project=project)
        host_info = json.loads(host.hostInfo)
        temp_config.extend(host_info["variables"])
        temp_baseurl = host.base_url if host.base_url else ''

    for content in test_list:
        body = eval(content["body"])

        if "base_url" in body["request"].keys():
            config = eval(
                models.Config.objects.get(name=body["name"],
                                          project__id=project).body)
            continue

        test_case.append(parse_host(host, body))

    if config and host != "请选择":
        config["variables"].extend(temp_config)
        if temp_baseurl:
            config["request"]["base_url"] = temp_baseurl
    if not config and host != "请选择":
        config = {
            "variables": temp_config,
            "request": {
                "base_url": temp_baseurl
            }
        }

    try:
        if back_async:
            tasks.async_debug_test.delay(test_case,
                                         project,
                                         name=name,
                                         report_name=report_name,
                                         config=parse_host(host, config),
                                         test_data=test_data)
            summary = loader.TEST_NOT_EXISTS
            summary["msg"] = "用例运行中,请稍后查看报告"
        else:
            summary = loader.debug_api(test_case,
                                       project,
                                       name=name,
                                       config=parse_host(host, config),
                                       save=True,
                                       test_data=test_data,
                                       report_name=report_name)
        return Response(summary)
    except Exception as e:
        return Response({'traceback': str(e)}, status=400)
Beispiel #15
0
                    case = models.Case.objects.get(id=index)
                    suite.append({"name": case.name, "id": index})
                except ObjectDoesNotExist:
                    pass

            for content in suite:
                test_list = models.CaseStep.objects. \
                    filter(case__id=content["id"]).order_by("step").values("body")

                testcase_list = []
                config = None
                for content in test_list:
                    body = eval(content["body"])
                    if "base_url" in body["request"].keys():
                        config = eval(
                            models.Config.objects.get(
                                name=body["name"],
                                project=plan_sub.project).body)
                        continue
                    testcase_list.append(parse_host(host, body))

                config_list.append(parse_host(host, config))
                test_sets.append(testcase_list)

            tags = {"project": plan_sub.project.id, "tag": plan_sub.tag}
            tasks.async_automation_suite.delay(test_sets, tags, suite,
                                               request.data, config_list)
            break

    return Response({"success": True, "msg": "集成自动化用例运行中", "code": "0001"})
Beispiel #16
0
def schedule_debug_suite(*args, **kwargs):
    """定时任务
    """
    project = int(kwargs["project"])

    sample_summary = []
    for cases in args:
        case_kwargs = cases.get('kwargs', '')
        test_list = models.CaseStep.objects.filter(
            case__id=cases["id"]).order_by("step").values("body")
        report_name = cases["name"]
        case_name = cases["name"]
        test_case = []
        config = None
        temp_config = []
        test_data = None
        temp_baseurl = ''
        g_host_info = ''
        if case_kwargs:
            report_name = case_kwargs["testCaseName"]
            if case_kwargs["currentTestDataExcel"] != '请选择' and case_kwargs[
                    "currentTestDataSheet"]:
                test_data = (case_kwargs["currentTestDataExcel"],
                             case_kwargs["currentTestDataSheet"])
            if case_kwargs["hostInfo"] != "请选择":
                g_host_info = case_kwargs["hostInfo"]
                host = models.HostIP.objects.get(name=g_host_info,
                                                 project__id=project)
                _host_info = json.loads(host.hostInfo)
                temp_config.extend(_host_info["variables"])
                temp_baseurl = host.base_url if host.base_url else ''

        for content in test_list:
            body = eval(content["body"])
            if "base_url" in body["request"].keys():
                config = eval(
                    models.Config.objects.get(name=body["name"],
                                              project__id=project).body)
                continue
            test_case.append(parse_host(host, body))

        if config and g_host_info not in ["请选择", '']:
            config["variables"].extend(temp_config)
            if temp_baseurl:
                config["request"]["base_url"] = temp_baseurl
        if not config and g_host_info not in ["请选择", '']:
            config = {
                "variables": temp_config,
                "request": {
                    "base_url": temp_baseurl
                }
            }

        summary = debug_api(test_case,
                            project,
                            name=case_name,
                            config=parse_host(host, config),
                            save=False,
                            test_data=test_data)
        save_summary(report_name, summary, project, type=3)
        if kwargs["strategy"] != '从不发送':
            summary["name"] = report_name
            sample_summary.append(summary)

    if sample_summary:
        runresult = parser_runresult(sample_summary)
        is_send_email = control_email(runresult, kwargs)
        if is_send_email:
            peoject_name = models.Project.objects.get(id=project).name
            subject_name = peoject_name + kwargs["task_name"]
            html_conetnt = prepare_email_content(runresult, subject_name)
            send_file_path = prepare_email_file(sample_summary)
            print(send_file_path[0])
            send_status = send_result_email(subject_name,
                                            kwargs["receiver"],
                                            kwargs["mail_cc"],
                                            send_html_content=html_conetnt,
                                            send_file_path=send_file_path)
            if send_status:
                print('邮件发送成功')
            else:
                print('邮件发送失败')