diff --git a/common/tone/tone_request.py b/common/tone/tone_request.py index b01f72746bc8f9c48ffbc947ff41072c9097c88f..e17d1f9a6e5ddea090379ee16e28de5f83ad441f 100644 --- a/common/tone/tone_request.py +++ b/common/tone/tone_request.py @@ -1,6 +1,7 @@ import time import base64 import json +import requests from app.conf import conf from common.enums import Test_Type from common.http import http_request @@ -15,7 +16,11 @@ async def get_res_from_tone(req_type, req_api, req_params): 'signature': signature } req_data.update(req_params) - status, result = await http_request(method=req_type, url=tone_url, data=json.dumps(req_data)) + if req_type == 'get': + ret = requests.get(tone_url, params=req_data, verify=False) + status, result = ret.status_code, ret.text + else: + status, result = await http_request(method=req_type, url=tone_url, data=json.dumps(req_data)) return status, result diff --git a/models/plan_model.py b/models/plan_model.py index 398978ad4ce6f4edb32d916009f819802429511b..ada69e317fc382b156cdef341cd6b37736da4f4a 100644 --- a/models/plan_model.py +++ b/models/plan_model.py @@ -2,6 +2,7 @@ from sqlalchemy import Column, String, Integer, JSON, Boolean from common.enums import Status_EN from models import CommonModel +from services.const import ERROR_UN_EXISTED_PLAN class Plan(CommonModel): @@ -26,3 +27,12 @@ class PlanReview(CommonModel): reviewer = Column(String(32), nullable=False, comment='测试需方案的评审人') status = Column(String(16), nullable=False, default=Status_EN.REVIEWING.value, comment='评审状态') desc = Column(String(512), nullable=True, comment='评审内容') + + +async def update_plan_status(status, plan_id): + plan = await Plan.query_obj_one(Plan.id == plan_id) + if not plan: + return ERROR_UN_EXISTED_PLAN, False + plan.status = status + await plan.update() + return plan.to_dict(), True diff --git a/models/task_model.py b/models/task_model.py index b7ace122e57165001b6a392acb624d54633fc7ec..5abdbdbb577017a0fcd6f61c2baa8e6f8deac9ea 100644 --- a/models/task_model.py +++ b/models/task_model.py @@ -2,6 +2,7 @@ from sqlalchemy import Column, String, Integer, Enum, JSON, update, Boolean from common.enums import Status_EN, Task_Run_Method from models import CommonModel +from services.const import ERROR_UN_EXISTED_TASK class Task(CommonModel): @@ -26,3 +27,13 @@ async def update_manual_task_status(task_ids): status=Status_EN.RUNNING.value) await Task.exec_orm(batch_update_orm) return + + +async def update_task_status(status, task_id): + task = await Task.query_obj_one(Task.id == task_id) + if not task: + return ERROR_UN_EXISTED_TASK, False + task.status = status + await task.update() + return task.to_dict(), True + diff --git a/services/task_service.py b/services/task_service.py index 2724dd2ec91abcc625177ecd3b54c951b5a524d9..da1204c7adeb23fff127323f472fe2b924b23101 100644 --- a/services/task_service.py +++ b/services/task_service.py @@ -37,12 +37,14 @@ async def __gen_run_result_case_infos(case_ids): for case in cases: case_infos.append({ 'name': case.name, + 'tone_case_id': case.tone_case, 'suite_name': case.suite_name, 'priority': case.priority, 'creator': case.creator, 'type': case.type, 'run_method': 'manual', - 'result': '' + 'result': '', + 'statistics': '' }) return case_infos @@ -92,7 +94,7 @@ async def modify_task(data, task_id, user): task.config = data['config'] if 'cases' in data: if data['cases']: - case_infos = __gen_run_result_case_infos(data['cases'].split(',')) + case_infos = await __gen_run_result_case_infos(data['cases'].split(',')) task.run_result['case_infos'] = case_infos else: task.run_result['case_infos'] = [] diff --git a/services/tone_job_service.py b/services/tone_job_service.py index 8efb9d980384d0fc80defc808b326bc8e890ca8b..c400da651e8b27877822103d349ff04480893e59 100644 --- a/services/tone_job_service.py +++ b/services/tone_job_service.py @@ -3,8 +3,9 @@ import time from app.conf import conf from common.enums import Tone_Job_State, Track_Result, Case_Result, Status_EN from models.job_model import ToneJob, PerfResult, FuncResult +from models.task_model import Task, update_task_status +from models.plan_model import update_plan_status from services.const import ERROR_UN_EXISTED_TONE_JOB -from services.task_service import update_task_status from common.tone.tone_request import get_res_from_tone from common.tone.api import TONE_JOB_QUERY, TONE_CREATE_JOB @@ -28,10 +29,16 @@ async def update_job(data, is_finished): tone_job.state = Tone_Job_State.SUCCESS.value result = await tone_job.update() if is_finished: - unfinished_job = await ToneJob.query_obj_one(ToneJob.task_id == tone_job.task_id and - ToneJob.state != Tone_Job_State.SUCCESS.value) + unfinished_job = await ToneJob.query_obj_one(ToneJob.task_id == tone_job.task_id, + ToneJob.state != Tone_Job_State.SUCCESS) if not unfinished_job: await update_task_status(Status_EN.FINISH.value, tone_job.task_id) + task = await Task.query_obj_one(Task.id == tone_job.task_id) + if task: + unfinished_task = await Task.query_obj_one(Task.plan_id == task.plan_id, + Task.status != Status_EN.FINISH) + if not unfinished_task: + await update_plan_status(Status_EN.FINISH, task.plan_id) return result.to_dict(), True @@ -41,73 +48,95 @@ async def save_job_result(data): if not tone_job: return ERROR_UN_EXISTED_TONE_JOB, False if test_type == 'functional': - await save_func_detail(tone_job.task_id, data.get('job_result'), data.get('job_id')) + await save_func_detail(tone_job.task_id, data) else: - await save_perf_detail(tone_job.task_id, data.get('job_result'), data.get('job_id')) + await save_perf_detail(tone_job.task_id, data) return None, True -async def save_func_detail(task_id, job_result, tone_job_id): +async def save_func_detail(task_id, data): + tone_job_id = data.get('job_id') func_results = await FuncResult.query_obj_all(FuncResult.tone_job_id == tone_job_id) if len(func_results) > 0: - func_results.remove() - func_result_list = list() - for func_result in job_result: - test_suite_id = func_result.get('test_suite_id') - test_case_id = func_result.get('test_case_id') - if len(func_result['case_result']) == 0 and func_result['case_state'] == 'fail': - func_result_list.append({ - 'sub_case_name': f'{func_result["test_suite"]}:{func_result["test_case"]}', - 'sub_case_result': Case_Result.SKIP, - 'tone_suite_id': test_suite_id, - 'tone_case_id': test_case_id, - 'tone_job_id': tone_job_id, - 'task_id': task_id - }) - continue - for case_result in func_result.get('case_result'): - if case_result.get('sub_case_result') == 2: - case_state = Case_Result.FAIL.value - elif case_result.get('sub_case_result') == 1: - case_state = Case_Result.SUCCESS.value - else: - case_state = Case_Result.SKIP.value - func_result_obj = dict({ - 'sub_case_name': case_result.get('sub_case_name'), - 'sub_case_result': case_state, - 'tone_suite_id': test_suite_id, - 'tone_case_id': test_case_id, - 'tone_job_id': tone_job_id, - 'task_id': task_id - }) - func_result_list.append(func_result_obj) - await FuncResult().batch_add(func_result_list) - - -async def save_perf_detail(task_id, job_result, tone_job_id): + for result in func_results: + result.remove() + task = await Task.query_obj_one(Task.id == task_id) + if task: + run_result = task.run_result + run_result['statistics'] = data.get('result_statistics') + func_result_list = list() + for func_result in data.get('job_result'): + test_suite_id = func_result.get('test_suite_id') + test_case_id = func_result.get('test_case_id') + case = [task_case_result for task_case_result in run_result.get('case_infos') + if task_case_result['tone_case_id'] == test_case_id] + if len(case) == 1: + case[0]['result'] = func_result.get('case_state') + if len(func_result['case_result']) == 0 and func_result['case_state'] == 'fail': + func_result_list.append({ + 'sub_case_name': f'{func_result["test_suite"]}:{func_result["test_case"]}', + 'sub_case_result': Case_Result.FAIL, + 'tone_suite_id': test_suite_id, + 'tone_case_id': test_case_id, + 'tone_job_id': tone_job_id, + 'task_id': task_id + }) + continue + for case_result in func_result.get('case_result'): + if case_result.get('sub_case_result') == 2: + case_state = Case_Result.FAIL.value + elif case_result.get('sub_case_result') == 1: + case_state = Case_Result.SUCCESS.value + else: + case_state = Case_Result.SKIP.value + func_result_obj = dict({ + 'sub_case_name': case_result.get('sub_case_name'), + 'sub_case_result': case_state, + 'tone_suite_id': test_suite_id, + 'tone_case_id': test_case_id, + 'tone_job_id': tone_job_id, + 'task_id': task_id + }) + func_result_list.append(func_result_obj) + await FuncResult().batch_add(func_result_list) + await task.update() + + +async def save_perf_detail(task_id, data): + tone_job_id = data.get('job_id') perf_results = await PerfResult.query_obj_all(PerfResult.tone_job_id == tone_job_id) if len(perf_results) > 0: - perf_results.remove() - perf_result_list = list() - for perf_result in job_result: - test_suite_id = perf_result.get('test_suite_id') - test_case_id = perf_result.get('test_case_id') - for case_result in perf_result.get('case_result'): - perf_result_obj = dict({ - 'metric': case_result.get('metric'), - 'test_value': case_result.get('test_value'), - 'cv_value': case_result.get('cv_value'), - 'max_value': case_result.get('max_value'), - 'min_value': case_result.get('min_value'), - 'unit': case_result.get('unit'), - 'track_result': Track_Result(case_result.get('track_result')).value, - 'tone_suite_id': test_suite_id, - 'tone_case_id': test_case_id, - 'tone_job_id': tone_job_id, - 'task_id': task_id - }) - perf_result_list.append(perf_result_obj) - await PerfResult().batch_add(perf_result_list) + for result in perf_results: + result.remove() + task = await Task.query_obj_one(Task.id == task_id) + if task: + run_result = task.run_result + run_result['statistics'] = data.get('result_statistics') + perf_result_list = list() + for perf_result in data.get('job_result'): + test_suite_id = perf_result.get('test_suite_id') + test_case_id = perf_result.get('test_case_id') + case = [task_case_result for task_case_result in run_result.get('case_infos') + if task_case_result['tone_case_id'] == test_case_id] + if len(case) == 1: + case[0]['result'] = perf_result.get('case_state') + for case_result in perf_result.get('case_result'): + perf_result_obj = dict({ + 'metric': case_result.get('metric'), + 'test_value': case_result.get('test_value'), + 'cv_value': case_result.get('cv_value'), + 'max_value': case_result.get('max_value'), + 'min_value': case_result.get('min_value'), + 'unit': case_result.get('unit'), + 'track_result': Track_Result(case_result.get('track_result')).value, + 'tone_suite_id': test_suite_id, + 'tone_case_id': test_case_id, + 'tone_job_id': tone_job_id, + 'task_id': task_id + }) + perf_result_list.append(perf_result_obj) + await PerfResult().batch_add(perf_result_list) + await task.update() async def create_tone_job(data):