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)
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}
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)
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)
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)
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)
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)
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)
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)
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)
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('邮件发送失败')
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)
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)
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"})
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('邮件发送失败')