diff --git a/MangoActuator/requirements.txt b/MangoActuator/requirements.txt index 7a6d4005..7521e7bd 100644 --- a/MangoActuator/requirements.txt +++ b/MangoActuator/requirements.txt @@ -1,8 +1,7 @@ -playwright==1.46.0 -uiautomator2==3.2.2 +playwright==1.47.0 +uiautomator2==3.2.5 pywinauto==0.6.8 -uiautodev==0.4.0 -weditor==0.6.4 +uiautodev==0.5.0 locust mangokit==1.1.37 mangoui==3.0.10 diff --git a/MangoActuator/src/consumer/api.py b/MangoActuator/src/consumer/api.py index 2d98275b..a93db710 100644 --- a/MangoActuator/src/consumer/api.py +++ b/MangoActuator/src/consumer/api.py @@ -6,7 +6,7 @@ import aiohttp from aiohttp.client_exceptions import ClientResponse -from src.models.api_model import RequestModel +from src.models.api_model import ResponseDataModel from src.services.api.service.case_run import ApiCaseRun from src.tools.decorator.convert_args import convert_args @@ -14,8 +14,8 @@ from src.tools.decorator.convert_args import convert_args class API: api = ApiCaseRun() - @convert_args(RequestModel) - async def a_api_info(self, data: RequestModel): + @convert_args(ResponseDataModel) + async def a_api_info(self, data: ResponseDataModel): response: ClientResponse | None = None time = None session = aiohttp.ClientSession() @@ -23,6 +23,6 @@ class API: await session.close() @classmethod - @convert_args(RequestModel) - async def a_api_case(cls, data: RequestModel): + @convert_args(ResponseDataModel) + async def a_api_case(cls, data: ResponseDataModel): pass diff --git a/MangoActuator/src/models/api_model.py b/MangoActuator/src/models/api_model.py index 60d0fe2a..34ada64b 100644 --- a/MangoActuator/src/models/api_model.py +++ b/MangoActuator/src/models/api_model.py @@ -2,60 +2,39 @@ # @Project: 芒果测试平台 # @Description: # @Time : 2022-12-04 17:14 # @Author : 毛鹏 +from typing import Any + from pydantic import BaseModel -class RequestModel(BaseModel): - """请求""" +class ApiCaseModel(BaseModel): + test_suite_details: int + test_suite: int case_id: int - case_name: str - url: str - method: str - header: str | None - body_type: int = None - body: dict | str = None + test_env: int + user_id: int + tasks_id: int -class ApiCaseGroupModel(BaseModel): - group_name: str - case_group_list: list[RequestModel] +class RequestDataModel(BaseModel): + method: str | None + url: str | None + headers: str | dict | list | None = None + params: dict | list | str | None = None + data: dict | list | None = None + json_data: dict | list | None = None + file: list[dict] | Any | None = None -class PublicModel(BaseModel): - end: int - public_type: int - name: str - key: str - value: str - - -class ResponseModel(BaseModel): - case_id: int - case_name: str - url: str - method: str - header: dict +class ResponseDataModel(BaseModel): + status_code: int response_time: float - res_code: int - body_type: int = None - body: dict = None - response: dict - assertion_res: bool = None + response_headers: dict + response_json: dict | None = None + response_text: str | None = None -class ApiPublicModel(BaseModel): - """api公共""" - project_id: int - client: int - public_type: int - name: str - key: str - value: str - status: int - type: int - - -class ApiInfoModel(BaseModel): +class RecordingApiModel(BaseModel): """ApiInfo模型""" project_product: int username: str @@ -71,3 +50,49 @@ class ApiInfoModel(BaseModel): json_data: list | dict | None = None file: str | None = None status: int | None = None + + +class ApiInfoModel(BaseModel): + """ApiInfo模型""" + project: int + type: int = 0 + module_name: int | None = None + name: str + client: int = 0 + url: str + method: int + header: dict | None = None + params: list | dict | None = None + data: list | dict | None = None + json_data: list | dict | None = None + file: str | None = None + status: int | None = None + + +class AssResultModel(BaseModel): + type: str + expect: str | None + actual: str | None + + +class ApiCaseStepsResultModel(BaseModel): + """接口结果""" + id: int + name: str + status: int + error_message: str | None = None + ass: list[AssResultModel] + request: RequestDataModel + response: ResponseDataModel + cache_data: dict + + +class ApiCaseResultModel(BaseModel): + """用例结果""" + id: int + name: str + test_env: int + user_id: int + status: int + error_message: str | None = None + steps: list[ApiCaseStepsResultModel] = [] diff --git a/MangoActuator/src/models/ui_model.py b/MangoActuator/src/models/ui_model.py index e92ae222..c774af9f 100644 --- a/MangoActuator/src/models/ui_model.py +++ b/MangoActuator/src/models/ui_model.py @@ -144,7 +144,7 @@ class UiCaseResultModel(BaseModel): status: int error_message: str | None = None video_path: str | None = None - page_steps_result: list[PageStepsResultModel] = [] + steps: list[PageStepsResultModel] = [] class PageObject: diff --git a/MangoActuator/src/network/http/system/home.py b/MangoActuator/src/network/http/system/home.py index 0ecfcce2..d4cba972 100644 --- a/MangoActuator/src/network/http/system/home.py +++ b/MangoActuator/src/network/http/system/home.py @@ -27,7 +27,3 @@ class Home(HttpBase): def case_sum(cls): return requests.get(cls.url(f'{Home._url}/case/sum'), cls.headers) - @classmethod - @request_log() - def result_week(cls): - return requests.get(cls.url(f'ui/result/week'), cls.headers) diff --git a/MangoActuator/src/network/http/system/test_suite_details.py b/MangoActuator/src/network/http/system/test_suite_details.py index 1302d44a..2cebf4c4 100644 --- a/MangoActuator/src/network/http/system/test_suite_details.py +++ b/MangoActuator/src/network/http/system/test_suite_details.py @@ -37,3 +37,7 @@ class TestSuiteDetails(HttpBase): @request_log() def delete_test_suite_details(cls, _id, ): return cls.delete(url=cls.url(TestSuiteDetails._url), headers=cls.headers, params={'id': _id, }) + @classmethod + @request_log() + def get_test_suite_report(cls, ): + return cls.get(url=cls.url(f'{TestSuiteDetails._url}/report'), headers=cls.headers, ) \ No newline at end of file diff --git a/MangoActuator/src/network/http/ui/page_element.py b/MangoActuator/src/network/http/ui/page_element.py index a63621a6..db3b7905 100644 --- a/MangoActuator/src/network/http/ui/page_element.py +++ b/MangoActuator/src/network/http/ui/page_element.py @@ -54,6 +54,7 @@ class Element(HttpBase): 'type': _type, 'ope_key': ope_key, 'ope_value': ope_value, + 'is_send': True } return cls.post(url=f'{url}/test', headers=cls.headers, json=json_data) diff --git a/MangoActuator/src/pages/api/case/case.py b/MangoActuator/src/pages/api/case/case.py index 08c69aaf..3821f709 100644 --- a/MangoActuator/src/pages/api/case/case.py +++ b/MangoActuator/src/pages/api/case/case.py @@ -3,9 +3,8 @@ # @Description: # @Time : 2024-08-28 16:30 # @Author : 毛鹏 -from mango_ui import ComboBoxDataModel, FormDataModel, response_message +from mango_ui import ComboBoxDataModel, FormDataModel, response_message, error_message -from src.enums.tools_enum import StatusEnum from src.models.socket_model import ResponseModel from src.models.user_model import UserModel from .case_dict import * @@ -48,3 +47,11 @@ class ApiCasePage(TableParent): def run(self, row): user_info = UserModel() response_message(self, HTTP.get_api_test_case(row.get("id"), user_info.selected_environment, )) + + def batch_run(self): + case_id_list = self.table_widget.table_widget.get_selected_items() + if not case_id_list: + error_message(self, '请按住shift然后使用鼠标在表格进行多选,然后再点击批量执行') + return + user_info = UserModel() + response_message(self, HTTP.get_api_test_case_batch(case_id_list, user_info.selected_environment, )) diff --git a/MangoActuator/src/pages/api/case/case_dict.py b/MangoActuator/src/pages/api/case/case_dict.py index 9e74ff1d..e9792add 100644 --- a/MangoActuator/src/pages/api/case/case_dict.py +++ b/MangoActuator/src/pages/api/case/case_dict.py @@ -44,7 +44,8 @@ search_data = [ } ] right_data = [ - {'name': '新增', 'theme': THEME.group.info, 'action': 'add'} + {'name': '新增', 'theme': THEME.group.info, 'action': 'add'}, + {'name': '批量执行', 'theme': THEME.group.success, 'action': 'batch_run'}, ] form_data = [ diff --git a/MangoActuator/src/pages/config/product_module/module.py b/MangoActuator/src/pages/config/product_module/module.py index 460b1473..5c1a886c 100644 --- a/MangoActuator/src/pages/config/product_module/module.py +++ b/MangoActuator/src/pages/config/product_module/module.py @@ -6,6 +6,7 @@ from src.network import HTTP from src.pages.parent.sub import SubPage +from src.tools.methods import Methods from .module_dict import * @@ -24,3 +25,7 @@ class ModulePage(SubPage): self.post = HTTP.post_module self.put = HTTP.put_module self._delete = HTTP.delete_module + + def show_data(self, is_refresh=False): + super().show_data() + Methods.set_project() diff --git a/MangoActuator/src/pages/report/test_suite.py b/MangoActuator/src/pages/report/test_suite.py index 0d90eb42..19063c8b 100644 --- a/MangoActuator/src/pages/report/test_suite.py +++ b/MangoActuator/src/pages/report/test_suite.py @@ -38,13 +38,13 @@ class TestSuitePage(TableParent): self.layout_v.addWidget(self.table_widget, 7) def show_data(self, is_refresh=False): - response_model = HTTP.result_week() - # self.line_plot_1.draw([ - # {'name': '成功', 'value': response_model.data.get('success')}, - # {'name': '失败', 'value': response_model.data.get('fail')} - # ]) - # self.pie_plot_1.draw([ - # {'name': '失败数', 'value': response_model.data.get('failSun')}, - # {'name': '成功数', 'value': response_model.data.get('successSun')} - # ]) + response_model = HTTP.get_test_suite_report() + self.line_plot_1.draw([ + {'name': '成功', 'value': response_model.data.get('success')}, + {'name': '失败', 'value': response_model.data.get('fail')} + ]) + self.pie_plot_1.draw([ + {'name': '失败数', 'value': response_model.data.get('failSun')}, + {'name': '成功数', 'value': response_model.data.get('successSun')} + ]) super().show_data(is_refresh) diff --git a/MangoActuator/src/pages/report/test_suite_detailed.py b/MangoActuator/src/pages/report/test_suite_detailed.py index b90e00aa..90c1afee 100644 --- a/MangoActuator/src/pages/report/test_suite_detailed.py +++ b/MangoActuator/src/pages/report/test_suite_detailed.py @@ -3,18 +3,18 @@ # @Description: # @Time : 2024-09-01 下午9:01 # @Author : 毛鹏 -import json from mango_ui import * -from src.enums.api_enum import MethodEnum -from src.enums.tools_enum import Status3Enum, StatusEnum +from src.enums.tools_enum import Status3Enum, StatusEnum, TaskEnum from src.network import HTTP from src.pages.parent.sub import SubPage from .test_suite_detailed_dict import * from ...enums.system_enum import AutoTestTypeEnum from ...enums.ui_enum import ElementOperationEnum +from ...models.api_model import ApiCaseStepsResultModel from ...models.socket_model import ResponseModel +from ...models.ui_model import PageStepsResultModel class TestSuiteDetailedPage(SubPage): @@ -32,25 +32,46 @@ class TestSuiteDetailedPage(SubPage): self.mango_tree = MangoTree('测试套') self.mango_tree.clicked.connect(self.mango_tree_click) self.layout_v_1.addWidget(self.mango_tree) - self.layout_h.addLayout(self.layout_v_1) + self.layout_h.addLayout(self.layout_v_1, 4) self.layout_v_2 = MangoVBoxLayout() self.scroll_area = MangoScrollArea() self.layout_v_2.addWidget(self.scroll_area) - self.layout_h.addLayout(self.layout_v_2, ) + self.layout_h.addLayout(self.layout_v_2, 6) def show_data(self, is_refresh=False): if self.field_list: self.title_info.init(self.data, self.field_list) - if self.data.get('type') == AutoTestTypeEnum.UI.value: - response_model: ResponseModel = HTTP.suite_get_case(self.data.get('id')) - else: - response_model: ResponseModel = HTTP.get_api_result_suite_case(self.data.get('id')) - self.mango_tree.set_item([TreeModel(**i) for i in response_model.data.get('data')]) + response_model: ResponseModel = HTTP.get_test_suite_details( + page=1, + page_size=10000, + params={f'{self.id_key}_id': self.data.get('id')} + ) + tree_list = [] + for i in response_model.data: + tree_model = TreeModel( + key=str(i['case_id']), + status=i['status'], + title=f"{TaskEnum.get_value(i['status'])}-{i['case_name']}", + data=i, + ) + result_data = i.get('result_data') if i.get('result_data') is not None else [] + for e in result_data: + tree_model.children.append(TreeModel( + key=str(e['id']), + status=e['status'], + title=f"{TaskEnum.get_value(e['status'])}-{e['name']}", + data=e) + ) + tree_list.append(tree_model) + self.mango_tree.clear_items() + self.mango_tree.set_item(tree_list) if response_model.code != 200: response_message(self, response_model) return response_model def mango_tree_click(self, data: TreeModel): + if 'result_data' in data.data.keys() and data.data.get("result_data") is None: + return if self.data.get('type') == AutoTestTypeEnum.UI.value: self.set_ui(data) else: @@ -58,7 +79,6 @@ class TestSuiteDetailedPage(SubPage): def set_api(self, data: TreeModel): WidgetTool.remove_layout(self.scroll_area.layout) - mango_tabs = MangoTabs() self.scroll_area.layout.addWidget(mango_tabs) layout_request = MangoHBoxLayout() @@ -102,62 +122,60 @@ class TestSuiteDetailedPage(SubPage): layout_ass.setAlignment(Qt.AlignTop) # type: ignore mango_tabs.add_tab(layout_ass, '断言信息') - response_data = HTTP.get_api_info_result(params={'id': int(data.key.split("-")[1])}) - response_data = response_data.data[0] if response_data.data else {} - request_info.addWidget(MangoLabel(f'接口ID:{response_data.get("api_info").get("id")}')) - request_info.addWidget(MangoLabel(f'接口名称:{response_data.get("api_info").get("name")}')) - request_info.addWidget( - MangoLabel(f'请求方法:{MethodEnum.get_value(response_data.get("api_info").get("method"))}')) - request_info.addWidget(MangoLabel(f'接口URL:{response_data.get("url")}')) - request_headers.addWidget(MangoTextEdit('', WidgetTool.json_init_data(response_data.get("headers")))) - request_params.addWidget(MangoTextEdit('', WidgetTool.json_init_data(response_data.get("params")))) - request_data.addWidget(MangoTextEdit('', WidgetTool.json_init_data(response_data.get("data")))) - request_json.addWidget(MangoTextEdit('', WidgetTool.json_init_data(response_data.get("json")))) - request_file.addWidget(MangoTextEdit('', WidgetTool.json_init_data(response_data.get("file")))) + layout_cache = MangoHBoxLayout() + layout_cache.setAlignment(Qt.AlignTop) # type: ignore + mango_tabs.add_tab(layout_cache, '缓存信息') - response_info.addWidget(MangoLabel(f'CODE:{response_data.get("response_code")}')) - response_info.addWidget(MangoLabel(f'响应时间:{response_data.get("response_code")}')) - response_info.addWidget(MangoLabel(f'测试结果:{Status3Enum.get_value(response_data.get("status"))}')) - response_info.addWidget(MangoLabel(f'失败提示:{response_data.get("error_message")}')) - response_headers.addWidget(MangoTextEdit('', WidgetTool.json_init_data(response_data.get("response_headers")))) - response_body.addWidget(MangoTextEdit('', WidgetTool.json_init_data(response_data.get("response_text")))) - layout_ass.addWidget(MangoLabel(f'{response_data.get("assertion")}')) + response_data = ApiCaseStepsResultModel(**data.data) + request_info.addWidget(MangoLabel(f'接口ID:{response_data.id}')) + request_info.addWidget(MangoLabel(f'接口名称:{response_data.name}')) + request_info.addWidget(MangoLabel(f'请求方法:{response_data.request.method}')) + request_info.addWidget(MangoLabel(f'接口URL:{response_data.request.url}')) + request_headers.addWidget(MangoTextEdit('', WidgetTool.json_init_data(response_data.request.headers))) + request_params.addWidget(MangoTextEdit('', WidgetTool.json_init_data(response_data.request.params))) + request_data.addWidget(MangoTextEdit('', WidgetTool.json_init_data(response_data.request.data))) + request_json.addWidget(MangoTextEdit('', WidgetTool.json_init_data(response_data.request.json_data))) + request_file.addWidget(MangoTextEdit('', WidgetTool.json_init_data(response_data.request.file))) + + response_info.addWidget(MangoLabel(f'CODE:{response_data.response.status_code}')) + response_info.addWidget(MangoLabel(f'响应时间:{response_data.response.response_time}')) + response_info.addWidget(MangoLabel(f'测试结果:{Status3Enum.get_value(response_data.status)}')) + response_info.addWidget(MangoLabel(f'失败提示:{response_data.error_message}')) + response_headers.addWidget( + MangoTextEdit('', WidgetTool.json_init_data(response_data.response.response_headers))) + response_body.addWidget(MangoTextEdit('', WidgetTool.json_init_data(response_data.response.response_text))) + layout_ass.addWidget(MangoLabel(f'{response_data.ass}')) + layout_cache.addWidget(MangoLabel(f'{response_data.cache_data}')) def set_ui(self, data: TreeModel): - data_key = json.loads(data.key) - response_data = HTTP.get_ele_result( - test_suite_id=data_key.get('test_suite_id'), - page_step_id=data_key.get('page_step_id'), - case_id=data_key.get('case_id')) + response_data = PageStepsResultModel(**data.data) WidgetTool.remove_layout(self.scroll_area.layout) - for item in response_data.data: - element_data: dict | None = item['element_data'] + for element_data in response_data.element_result_list: layout = MangoGridLayout() card = MangoCard(layout) - layout.addWidget(MangoLabel(f"元素名称: {item['ele_name']}"), 0, 0) - if element_data: - layout.addWidget(MangoLabel(f"状态: {Status3Enum.get_value(element_data['status'])}"), 0, 1) - layout.addWidget(MangoLabel(f"元素个数: {element_data.get('ele_quantity')}"), 0, 2) - layout.addWidget(MangoLabel(f"操作类型: {element_data.get('loc')}"), 1, 0) - layout.addWidget(MangoLabel(f"定位方式: {element_data.get('exp')}"), 1, 1) - layout.addWidget(MangoLabel(f"等待时间: {element_data.get('sleep')}"), 1, 2) - layout.addWidget(MangoLabel(f"元素下标: {element_data.get('sub')}"), 2, 0) - if element_data.get("type") == ElementOperationEnum.OPE.value: - layout.addWidget(MangoLabel(f"操作类型: {element_data.get('ope_key')}"), 3, 0) - layout.addWidget(MangoLabel(f"操作数据: {element_data.get('ope_value')}"), 3, 1) - elif element_data.get("type") == ElementOperationEnum.ASS.value: - layout.addWidget(MangoLabel(f"断言类型: {element_data.get('ope_key')}"), 3, 0) - layout.addWidget(MangoLabel(f"断言数据: {element_data.get('ope_value')}"), 3, 1) - layout.addWidget( - MangoLabel(f"预期: {element_data.get('expect')},期望:{element_data.get('actual')}"), 3, 2) - elif element_data.get("type") == ElementOperationEnum.SQL.value: - layout.addWidget(MangoLabel(f"SQL: {element_data.get('sql')}"), 3, 0) - layout.addWidget(MangoLabel(f"SQL_KEY: {element_data.get('key_list')}"), 3, 1) - else: - layout.addWidget(MangoLabel(f"key: {element_data.get('key')}"), 3, 0) - layout.addWidget(MangoLabel(f"value: {element_data.get('value')}"), 3, 1) + layout.addWidget(MangoLabel(f"元素名称: {element_data.name}"), 0, 0) + layout.addWidget(MangoLabel(f"状态: {Status3Enum.get_value(element_data.status)}"), 0, 1) + layout.addWidget(MangoLabel(f"元素个数: {element_data.ele_quantity}"), 0, 2) + layout.addWidget(MangoLabel(f"操作类型: {element_data.loc}"), 1, 0) + layout.addWidget(MangoLabel(f"定位方式: {element_data.exp}"), 1, 1) + layout.addWidget(MangoLabel(f"等待时间: {element_data.sleep}"), 1, 2) + layout.addWidget(MangoLabel(f"元素下标: {element_data.sub}"), 2, 0) + if element_data.type == ElementOperationEnum.OPE.value: + layout.addWidget(MangoLabel(f"操作类型: {element_data.ope_key}"), 3, 0) + layout.addWidget(MangoLabel(f"操作数据: {element_data.ope_value}"), 3, 1) + elif element_data.type == ElementOperationEnum.ASS.value: + layout.addWidget(MangoLabel(f"断言类型: {element_data.ope_key}"), 3, 0) + layout.addWidget(MangoLabel(f"断言数据: {element_data.ope_value}"), 3, 1) + layout.addWidget( + MangoLabel(f"预期: {element_data.expect},期望:{element_data.actual}"), 3, 2) + elif element_data.type == ElementOperationEnum.SQL.value: + layout.addWidget(MangoLabel(f"SQL: {element_data.sql}"), 3, 0) + layout.addWidget(MangoLabel(f"SQL_KEY: {element_data.key_list}"), 3, 1) + else: + layout.addWidget(MangoLabel(f"key: {element_data.key}"), 3, 0) + layout.addWidget(MangoLabel(f"value: {element_data.value}"), 3, 1) - if element_data['status'] == StatusEnum.FAIL.value: - layout.addWidget(MangoLabel(f"失败截图: {element_data.get('picture_path')}"), 4, 0) - layout.addWidget(MangoLabel(f"失败截图: {element_data.get('error_message')}"), 4, 1) + if element_data.status == StatusEnum.FAIL.value: + layout.addWidget(MangoLabel(f"失败截图: {element_data.picture_path}"), 4, 0) + layout.addWidget(MangoLabel(f"失败截图: {element_data.error_message}"), 4, 1) self.scroll_area.layout.addWidget(card) diff --git a/MangoActuator/src/pages/report/test_suite_detailed_dict.py b/MangoActuator/src/pages/report/test_suite_detailed_dict.py index e0b93a95..e6221d61 100644 --- a/MangoActuator/src/pages/report/test_suite_detailed_dict.py +++ b/MangoActuator/src/pages/report/test_suite_detailed_dict.py @@ -6,14 +6,13 @@ from mango_ui import THEME right_data = [ + {'name': '刷新', 'theme': THEME.group.info, 'action': 'show_data'}, {'name': '返回', 'theme': THEME.group.warning, 'action': 'back'} ] field_list = [ {'key': 'id', 'name': '测试套ID'}, - {'key': 'project_product', 'name': '项目名称'}, + {'key': 'project', 'name': '项目名称'}, {'key': 'create_time', 'name': '执行时间'}, {'key': 'status', 'name': '测试结果'}, {'key': 'test_env', 'name': '测试环境'}, - {'key': 'run_status', 'name': '执行状态'}, - {'key': 'error_message', 'name': '失败消息'}, ] diff --git a/MangoActuator/src/pages/tasks/scheduled/task_case.py b/MangoActuator/src/pages/tasks/scheduled/task_case.py index 65daf185..e12956cf 100644 --- a/MangoActuator/src/pages/tasks/scheduled/task_case.py +++ b/MangoActuator/src/pages/tasks/scheduled/task_case.py @@ -5,7 +5,7 @@ # @Author : 毛鹏 from mango_ui import response_message, DialogCallbackModel, ComboBoxDataModel, FormDataModel -from src.models.api_model import ResponseModel +from src.models.socket_model import ResponseModel from src.network import HTTP from src.pages.parent.sub import SubPage from .task_case_dict import * diff --git a/MangoActuator/src/pages/ui/case/case_steps.py b/MangoActuator/src/pages/ui/case/case_steps.py index 30ad54fc..517e63c1 100644 --- a/MangoActuator/src/pages/ui/case/case_steps.py +++ b/MangoActuator/src/pages/ui/case/case_steps.py @@ -9,7 +9,6 @@ import uuid from mango_ui import * from src.enums.ui_enum import DriveTypeEnum, ElementOperationEnum -from src.models.api_model import ResponseModel from src.models.user_model import UserModel from src.network import HTTP from src.tools.get_class_methods import GetClassMethod diff --git a/MangoActuator/src/pages/ui/page_steps/page_steps_detailed.py b/MangoActuator/src/pages/ui/page_steps/page_steps_detailed.py index e029ae0f..a34afea6 100644 --- a/MangoActuator/src/pages/ui/page_steps/page_steps_detailed.py +++ b/MangoActuator/src/pages/ui/page_steps/page_steps_detailed.py @@ -9,7 +9,7 @@ import json from mango_ui import * from src.enums.ui_enum import DriveTypeEnum -from src.models.api_model import ResponseModel +from src.models.socket_model import ResponseModel from src.models.ui_model import PageStepsModel, ElementResultModel, PageObject from src.models.user_model import UserModel from src.services.ui.service.test_page_steps import TestPageSteps @@ -49,32 +49,31 @@ class PageStepsDetailedPage(SubPage): self.select_data = None def update_card(self, ele_model: ElementResultModel): - WidgetTool.remove_layout(self.scroll_area.layout) layout = MangoGridLayout() card = MangoCard(layout) labels = [ - f"元素名称: {ele_model.ele_name}", - f"元素数量: {ele_model.element_data.ele_quantity}", - f"测试结果: {'成功' if ele_model.element_data.status else '失败'}", + f"元素名称: {ele_model.name}", + f"元素数量: {ele_model.ele_quantity}", + f"测试结果: {'成功' if ele_model.status else '失败'}", ] - if ele_model.element_data.type == ElementOperationEnum.OPE.value: - labels.append(f"操作类型: {ele_model.element_data.ope_key}") - elif ele_model.element_data.type == ElementOperationEnum.ASS.value: - labels.append(f"断言类型: {ele_model.element_data.ope_key}") - labels.append(f"预期值: {ele_model.element_data.expect}") - labels.append(f"实际值: {ele_model.element_data.actual}") - elif ele_model.element_data.type == ElementOperationEnum.SQL.value: - labels.append(f"sql_key: {ele_model.element_data.key_list}") - labels.append(f"sql语句: {ele_model.element_data.sql}") - elif ele_model.element_data.type == ElementOperationEnum.CUSTOM.value: - labels.append(f"参数key: {ele_model.element_data.key}") - labels.append(f"参数value: {ele_model.element_data.value}") + if ele_model.type == ElementOperationEnum.OPE.value: + labels.append(f"操作类型: {ele_model.ope_key}") + elif ele_model.type == ElementOperationEnum.ASS.value: + labels.append(f"断言类型: {ele_model.ope_key}") + labels.append(f"预期值: {ele_model.expect}") + labels.append(f"实际值: {ele_model.actual}") + elif ele_model.type == ElementOperationEnum.SQL.value: + labels.append(f"sql_key: {ele_model.key_list}") + labels.append(f"sql语句: {ele_model.sql}") + elif ele_model.type == ElementOperationEnum.CUSTOM.value: + labels.append(f"参数key: {ele_model.key}") + labels.append(f"参数value: {ele_model.value}") - labels.append(f"元素表达式: {ele_model.element_data.loc}") - if ele_model.element_data.status == StatusEnum.FAIL.value: - labels.append(f"失败提示:{ele_model.element_data.error_message}") - labels.append(f"失败截图: {ele_model.element_data.picture_path}") + labels.append(f"元素表达式: {ele_model.loc}") + if ele_model.status == StatusEnum.FAIL.value: + labels.append(f"失败提示:{ele_model.error_message}") + labels.append(f"失败截图: {ele_model.picture_path}") # 添加3行3列的数据 for row in range(3): @@ -87,13 +86,14 @@ class PageStepsDetailedPage(SubPage): self.scroll_area.layout.addWidget(card) def debug(self): + WidgetTool.remove_layout(self.scroll_area.layout) user_info = UserModel() response_model: ResponseModel = HTTP.ui_steps_run(user_info.selected_environment, self.data.get("id"), 0) response_message(self, response_model) if response_model.code == 200: data = PageStepsModel(**response_model.data) if PageObject.test_page_steps is None: - PageObject.test_page_steps = TestPageSteps(data.project_product) + PageObject.test_page_steps = TestPageSteps(self.parent, data.project_product) PageObject.test_page_steps.progress.connect(self.update_card) asyncio.run_coroutine_threadsafe( PageObject.test_page_steps.page_steps_mian(data), self.parent.loop) diff --git a/MangoActuator/src/services/api/service/case_run.py b/MangoActuator/src/services/api/service/case_run.py index b59b663a..4b647366 100644 --- a/MangoActuator/src/services/api/service/case_run.py +++ b/MangoActuator/src/services/api/service/case_run.py @@ -7,7 +7,7 @@ from aiohttp import ClientSession from aiohttp.client_reqrep import ClientResponse -from src.models.api_model import RequestModel +from src.models.api_model import ResponseDataModel from src.services.api.base_tools.http_request import HTTPRequest from src.tools.log_collector import log @@ -18,7 +18,7 @@ class Dependence: class ApiCaseRun(HTTPRequest, Dependence): - async def http_(self, session: ClientSession, request: RequestModel) -> tuple[ClientResponse, float]: + async def http_(self, session: ClientSession, request: ResponseDataModel) -> tuple[ClientResponse, float]: pass async def get_header(self) -> str: diff --git a/MangoActuator/src/services/ui/bases/android/new_android.py b/MangoActuator/src/services/ui/bases/android/new_android.py index 1a430c61..ae45dbba 100644 --- a/MangoActuator/src/services/ui/bases/android/new_android.py +++ b/MangoActuator/src/services/ui/bases/android/new_android.py @@ -8,6 +8,7 @@ from typing import Optional import uiautomator2 as u2 from adbutils import AdbTimeout +from uiautomator2 import ConnectError from src.exceptions import * from src.models.ui_model import EquipmentModel @@ -29,19 +30,22 @@ class NewAndroid: def new_android(self): if self.config is None: raise UiError(*ERROR_MSG_0042) - android = u2.connect(self.config.and_equipment) - self.info = android.info - self.example_dict.append({ - 'config': self.config, - 'info': self.info, - 'android': android - }) try: + + android = u2.connect(self.config.and_equipment) + self.info = android.info msg = f"设备启动成功!产品名称:{self.info.get('productName')}" + self.example_dict.append({ + 'config': self.config, + 'info': self.info, + 'android': android + }) + except ConnectError: + raise UiError(*ERROR_MSG_0047, value=(self.config.and_equipment,)) except RuntimeError: - raise UiError(*ERROR_MSG_0045, value=(self.config.equipment,)) + raise UiError(*ERROR_MSG_0045, value=(self.config.and_equipment,)) except (AdbTimeout, TimeoutError): - raise UiError(*ERROR_MSG_0047, value=(self.config.equipment,)) + raise UiError(*ERROR_MSG_0047, value=(self.config.and_equipment,)) else: android.implicitly_wait(10) return android diff --git a/MangoActuator/src/services/ui/service/page_steps.py b/MangoActuator/src/services/ui/service/page_steps.py index 7d06014c..e36889d2 100644 --- a/MangoActuator/src/services/ui/service/page_steps.py +++ b/MangoActuator/src/services/ui/service/page_steps.py @@ -64,6 +64,7 @@ class PageSteps(ElementOperation): return self.page_step_result_model def end_set(self, element_result): + self.progress.emit(element_result) self.page_step_result_model.cache_data = self.test_data.get_all() self.page_step_result_model.test_object = {'url': self.url, 'package_name': self.package_name} self.page_step_result_model.equipment = {'name': self.driver_object.web.config} diff --git a/MangoActuator/src/services/ui/service/test_case.py b/MangoActuator/src/services/ui/service/test_case.py index 5058f75b..e8cb4de7 100644 --- a/MangoActuator/src/services/ui/service/test_case.py +++ b/MangoActuator/src/services/ui/service/test_case.py @@ -3,7 +3,6 @@ # @Description: # @Time : 2023/5/4 14:33 # @Author : 毛鹏 -import asyncio import json import os import shutil @@ -75,7 +74,7 @@ class TestCase(PageSteps): await self.driver_init() page_steps_result_model = await self.steps_main() self.case_result \ - .page_steps_result \ + .steps \ .append(page_steps_result_model) self.case_result.status = StatusEnum.SUCCESS.value except MangoActuatorError as error: @@ -86,9 +85,8 @@ class TestCase(PageSteps): except Exception as error: traceback.print_exc() log.error(error) - self.case_result.status = StatusEnum.SUCCESS.value - await self.send_case_result( - f'发生未知错误,请联系管理员检查测试用例数据,用例名称:{self.case_model.name}') + self.case_result.status = StatusEnum.FAIL.value + self.case_result = f'发生未知错误,请联系管理员检查测试用例数据,用例名称:{self.case_model.name}' break try: await self.case_posterior(self.case_model.posterior_sql) @@ -96,8 +94,7 @@ class TestCase(PageSteps): traceback.print_exc() log.error(error) self.case_result.status = StatusEnum.SUCCESS.value - await self.send_case_result( - f'初始化用例后置数据发生未知异常,请联系管理员来解决,用例名称:{self.case_model.name}') + self.case_result = f'初始化用例后置数据发生未知异常,请联系管理员来解决,用例名称:{self.case_model.name}' await self.send_case_result( self.case_result.error_message if self.case_result.error_message else f'用例<{self.case_model.name}>测试完成' ) diff --git a/MangoActuator/src/settings/settings.py b/MangoActuator/src/settings/settings.py index 383006a4..ed1562cc 100644 --- a/MangoActuator/src/settings/settings.py +++ b/MangoActuator/src/settings/settings.py @@ -5,7 +5,7 @@ from mango_ui import AppConfig, MenusModel from src.tools import InitPath -IS_DEBUG = True +IS_DEBUG = False MEMORY_THRESHOLD = 100 diff --git a/MangoServer/PyAutoTest/auto_test/auto_api/service/api_call/case_flow.py b/MangoServer/PyAutoTest/auto_test/auto_api/service/api_call/case_flow.py index 0dac4765..be36e469 100644 --- a/MangoServer/PyAutoTest/auto_test/auto_api/service/api_call/case_flow.py +++ b/MangoServer/PyAutoTest/auto_test/auto_api/service/api_call/case_flow.py @@ -31,6 +31,12 @@ class CaseFlow: future = self.executor.submit(self.execute_task, case_model) self.futures.append(future) for future in as_completed(self.futures): + try: + result = future.result() + print(result) + except Exception as error: + traceback.print_exc() + log.system.error(f'API线程池发生异常:{error}') self.futures.remove(future) time.sleep(0.1) except Exception as error: @@ -39,16 +45,20 @@ class CaseFlow: @classmethod def execute_task(cls, case_model: ApiCaseModel): - from PyAutoTest.auto_test.auto_api.service.api_call.test_case import TestCase - test_case = TestCase( - user_id=case_model.user_id, - test_env=case_model.test_env, - tasks_id=case_model.tasks_id, - test_suite=case_model.test_suite, - test_suite_details=case_model.test_suite_details, - is_send=False, - ) - test_case.test_case(case_model.case_id) + try: + from PyAutoTest.auto_test.auto_api.service.api_call.test_case import TestCase + test_case = TestCase( + user_id=case_model.user_id, + test_env=case_model.test_env, + tasks_id=case_model.tasks_id, + test_suite=case_model.test_suite, + test_suite_details=case_model.test_suite_details, + is_send=False, + ) + return test_case.test_case(case_model.case_id) + except Exception as error: + traceback.print_exc() + log.system.error(f'API线程池发生异常:{error}') @classmethod def add_task(cls, case_model: ApiCaseModel): diff --git a/MangoServer/PyAutoTest/auto_test/auto_api/service/api_call/test_case.py b/MangoServer/PyAutoTest/auto_test/auto_api/service/api_call/test_case.py index ad11a804..cd325b0b 100644 --- a/MangoServer/PyAutoTest/auto_test/auto_api/service/api_call/test_case.py +++ b/MangoServer/PyAutoTest/auto_test/auto_api/service/api_call/test_case.py @@ -61,7 +61,7 @@ class TestCase(CaseDetailedInit): self.init_case_posterior(api_case) self.api_case_result.status = self.status.value self.update_test_case(case_id, self.status) - if self.tasks_id and self.test_suite: + if self.test_suite: UpdateTestSuite.update_test_suite_details(TestSuiteDetailsResultModel( id=self.test_suite_details, test_suite=self.test_suite, @@ -69,7 +69,7 @@ class TestCase(CaseDetailedInit): error_message=self.error_message, result_data=self.api_case_result )) - return self.api_case_result.model_dump() + return self.api_case_result.model_dump() except Exception as error: traceback.print_exc() log.api.error(f'API用例执行过程中发生异常:{error}') @@ -118,7 +118,6 @@ class TestCase(CaseDetailedInit): json_data=data.json, file=data.file )) - return request_data_model def case_steps_posterior( @@ -131,6 +130,8 @@ class TestCase(CaseDetailedInit): api_case_steps_result = ApiCaseStepsResultModel( id=data.api_info.id, name=data.api_info.name, + status=self.status.value, + error_message=self.error_message, ass=ass, request=request, response=response, diff --git a/MangoServer/PyAutoTest/auto_test/auto_api/service/base_tools/case_base.py b/MangoServer/PyAutoTest/auto_test/auto_api/service/base_tools/case_base.py index 6ebff011..c408c0e0 100644 --- a/MangoServer/PyAutoTest/auto_test/auto_api/service/base_tools/case_base.py +++ b/MangoServer/PyAutoTest/auto_test/auto_api/service/base_tools/case_base.py @@ -34,7 +34,7 @@ class CaseBase(ObtainTestData, BaseRequest): self.project_product_id = None - self.status = StatusEnum.FAIL + self.status = StatusEnum.SUCCESS self.error_message = None self.test_object: Optional[None | TestObject] = None diff --git a/MangoServer/PyAutoTest/auto_test/auto_system/migrations/0008_testsuitedetails_case_name.py b/MangoServer/PyAutoTest/auto_test/auto_system/migrations/0008_testsuitedetails_case_name.py new file mode 100644 index 00000000..b67c21bc --- /dev/null +++ b/MangoServer/PyAutoTest/auto_test/auto_system/migrations/0008_testsuitedetails_case_name.py @@ -0,0 +1,18 @@ +# Generated by Django 4.1.5 on 2024-11-27 11:50 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('auto_system', '0007_projectproduct_auto_type'), + ] + + operations = [ + migrations.AddField( + model_name='testsuitedetails', + name='case_name', + field=models.CharField(max_length=528, null=True, verbose_name='key'), + ), + ] diff --git a/MangoServer/PyAutoTest/auto_test/auto_system/models.py b/MangoServer/PyAutoTest/auto_test/auto_system/models.py index 9c64b8d1..8affe8fe 100644 --- a/MangoServer/PyAutoTest/auto_test/auto_system/models.py +++ b/MangoServer/PyAutoTest/auto_test/auto_system/models.py @@ -194,6 +194,7 @@ class TestSuiteDetails(models.Model): project_product = models.ForeignKey(to=ProjectProduct, to_field="id", on_delete=models.SET_NULL, null=True) test_env = models.SmallIntegerField(verbose_name="测试环境") case_id = models.SmallIntegerField(verbose_name="用例ID") + case_name = models.CharField(verbose_name="key", max_length=528, null=True) # 制作展示用 # 2待开始,3是进行中,0是失败,1是成功 status = models.SmallIntegerField(verbose_name="测试结果") error_message = models.TextField(verbose_name="错误提示", null=True) diff --git a/MangoServer/PyAutoTest/auto_test/auto_system/service/consumer.py b/MangoServer/PyAutoTest/auto_test/auto_system/service/consumer.py index 01e657a5..50189181 100644 --- a/MangoServer/PyAutoTest/auto_test/auto_system/service/consumer.py +++ b/MangoServer/PyAutoTest/auto_test/auto_system/service/consumer.py @@ -51,7 +51,7 @@ def consumer(): case_id=test_suite_details.case_id, test_env=test_suite_details.test_env, user_id=test_suite.user.id, - tasks_id=test_suite.tasks.id, + tasks_id=test_suite.tasks.id if test_suite.tasks else None, ) CaseFlow().add_task(api_case_model) log.system.info(f"推送API任务成功,用例数据:{api_case_model.model_dump_json()}") diff --git a/MangoServer/PyAutoTest/auto_test/auto_system/service/scheduled_tasks/add_tasks.py b/MangoServer/PyAutoTest/auto_test/auto_system/service/scheduled_tasks/add_tasks.py index c2677540..c29c3c48 100644 --- a/MangoServer/PyAutoTest/auto_test/auto_system/service/scheduled_tasks/add_tasks.py +++ b/MangoServer/PyAutoTest/auto_test/auto_system/service/scheduled_tasks/add_tasks.py @@ -37,7 +37,6 @@ class AddTasks: }) def add_test_suite_details(self, case_id_list: list[id]): - for case_id in case_id_list: if self._type == AutoTestTypeEnum.UI.value: case = UiCase.objects.get(id=case_id) @@ -49,6 +48,7 @@ class AddTasks: 'project_product': case.project_product.id, 'test_env': self.test_env, 'case_id': case_id, + 'case_name': case.name, 'status': TaskEnum.STAY_BEGIN.value, 'error_message': None, 'result': None, diff --git a/MangoServer/PyAutoTest/auto_test/auto_system/service/update_test_suite.py b/MangoServer/PyAutoTest/auto_test/auto_system/service/update_test_suite.py index d3808314..a0ec7c6a 100644 --- a/MangoServer/PyAutoTest/auto_test/auto_system/service/update_test_suite.py +++ b/MangoServer/PyAutoTest/auto_test/auto_system/service/update_test_suite.py @@ -29,7 +29,8 @@ class UpdateTestSuite: connection.ensure_connection() log.system.debug(f'开始更新测试套数据:{data.model_dump_json()}') test_suite_detail = TestSuiteDetails.objects.get(id=data.id) - test_suite_detail.result_data = data.result_data.model_dump() + test_suite_detail.result_data = [i.model_dump() for i in data.result_data.steps] + test_suite_detail.case_name = data.result_data.name test_suite_detail.status = data.status test_suite_detail.error_message = data.error_message test_suite_detail.save() diff --git a/MangoServer/PyAutoTest/auto_test/auto_system/urls.py b/MangoServer/PyAutoTest/auto_test/auto_system/urls.py index 1003d966..5365438d 100644 --- a/MangoServer/PyAutoTest/auto_test/auto_system/urls.py +++ b/MangoServer/PyAutoTest/auto_test/auto_system/urls.py @@ -12,7 +12,7 @@ from .views.socket_api import SocketApiViews from .views.tasks import TasksCRUD, TasksViews, TasksNoPermissionViews from .views.tasks_details import TasksDetailsCRUD, TasksDetailsViews from .views.test_suite import TestSuiteCRUD -from .views.test_suite_details import TestSuiteDetailsCRUD +from .views.test_suite_details import TestSuiteDetailsCRUD, TestSuiteDetailsViews from ..auto_system.views.database import DatabaseCRUD, DatabaseViews from ..auto_system.views.index import IndexViews from ..auto_system.views.notice_config import NoticeConfigCRUD, NoticeConfigViews @@ -55,6 +55,7 @@ urlpatterns = [ path('test/suite', TestSuiteCRUD.as_view()), # path('test/suite/details', TestSuiteDetailsCRUD.as_view()), + path('test/suite/details/report', TestSuiteDetailsViews.as_view({'get': 'test_suite_details_report'})), # path('case/sum', IndexViews.as_view({'get': 'case_sum'})), path('case/result/week/sum', IndexViews.as_view({'get': 'case_result_week_sum'})), diff --git a/MangoServer/PyAutoTest/auto_test/auto_system/views/test_suite_details.py b/MangoServer/PyAutoTest/auto_test/auto_system/views/test_suite_details.py index 5a4c52c7..5d080723 100644 --- a/MangoServer/PyAutoTest/auto_test/auto_system/views/test_suite_details.py +++ b/MangoServer/PyAutoTest/auto_test/auto_system/views/test_suite_details.py @@ -3,13 +3,18 @@ # @Description: # @Time : 2023-02-16 20:58 # @Author : 毛鹏 + from rest_framework import serializers +from rest_framework.decorators import action from rest_framework.viewsets import ViewSet from PyAutoTest.auto_test.auto_system.models import TestSuiteDetails -from PyAutoTest.auto_test.auto_system.views.test_object import TestObjectSerializers from PyAutoTest.auto_test.auto_system.views.project_product import ProjectProductSerializersC +from PyAutoTest.auto_test.auto_system.views.test_object import TestObjectSerializers from PyAutoTest.auto_test.auto_user.views.user import UserSerializers +from PyAutoTest.enums.tools_enum import StatusEnum +from PyAutoTest.tools.decorator.error_response import error_response +from PyAutoTest.tools.view import ResponseData, RESPONSE_MSG_0096 from PyAutoTest.tools.view.model_crud import ModelCRUD @@ -52,3 +57,89 @@ class TestSuiteDetailsCRUD(ModelCRUD): class TestSuiteDetailsViews(ViewSet): model = TestSuiteDetails serializer_class = TestSuiteDetailsSerializers + + @action(methods=['get'], detail=False) + @error_response('user') + def test_suite_details_report(self, request): + data = { + 'success': '', + 'fail': '', + 'failSun': self.model.objects.filter(status=StatusEnum.FAIL.value).count(), + 'successSun': self.model.objects.filter(status=StatusEnum.SUCCESS.value).count(), + } + fail = TestSuiteDetails.objects.raw( + """ + SELECT + weeks.id, + weeks.yearweek, + COALESCE(api_counts.total_count, 0) AS total_count + FROM ( + SELECT 'id'as id,YEARWEEK(DATE_SUB(NOW(), INTERVAL n WEEK)) AS yearweek + FROM ( + SELECT 0 AS n UNION ALL + SELECT 1 UNION ALL + SELECT 2 UNION ALL + SELECT 3 UNION ALL + SELECT 4 UNION ALL + SELECT 5 UNION ALL + SELECT 6 UNION ALL + SELECT 7 UNION ALL + SELECT 8 UNION ALL + SELECT 9 UNION ALL + SELECT 10 UNION ALL + SELECT 11 + ) weeks + ) weeks + LEFT JOIN ( + SELECT + MAX(test_suite_details.id) as id, + YEARWEEK(create_time) AS yearweek, + COUNT(YEARWEEK(create_time)) AS total_count + FROM test_suite_details + WHERE create_time >= DATE_SUB(NOW(), INTERVAL 12 WEEK) + GROUP BY YEARWEEK(create_time) + ) api_counts ON weeks.yearweek = api_counts.yearweek + ORDER BY weeks.yearweek; + + """ + ) + success = TestSuiteDetails.objects.raw( + """ + SELECT + weeks.id, + weeks.yearweek, + COALESCE(api_counts.total_count, 0) AS total_count + FROM ( + SELECT 'id' AS id, YEARWEEK(DATE_SUB(NOW(), INTERVAL n WEEK)) AS yearweek + FROM ( + SELECT 0 AS n UNION ALL + SELECT 1 UNION ALL + SELECT 2 UNION ALL + SELECT 3 UNION ALL + SELECT 4 UNION ALL + SELECT 5 UNION ALL + SELECT 6 UNION ALL + SELECT 7 UNION ALL + SELECT 8 UNION ALL + SELECT 9 UNION ALL + SELECT 10 UNION ALL + SELECT 11 + ) weeks + ) weeks + LEFT JOIN ( + SELECT + MAX(test_suite_details.id) AS id, + YEARWEEK(create_time) AS yearweek, + COUNT(*) AS total_count + FROM test_suite_details + WHERE create_time >= DATE_SUB(NOW(), INTERVAL 12 WEEK) + AND status = 1 + GROUP BY YEARWEEK(create_time) + ) api_counts ON weeks.yearweek = api_counts.yearweek + ORDER BY weeks.yearweek; + + """ + ) + data['fail'] = [result.total_count for result in fail] + data['success'] = [result.total_count for result in success] + return ResponseData.success(RESPONSE_MSG_0096, data) diff --git a/MangoServer/PyAutoTest/auto_test/auto_ui/urls.py b/MangoServer/PyAutoTest/auto_test/auto_ui/urls.py index 68af7f26..2e5d44d7 100644 --- a/MangoServer/PyAutoTest/auto_test/auto_ui/urls.py +++ b/MangoServer/PyAutoTest/auto_test/auto_ui/urls.py @@ -54,11 +54,4 @@ urlpatterns = [ path("config", UiConfigCRUD.as_view()), path("config/put/status", UiConfigViews.as_view({'put': 'put_status'})), path("config/new/browser/obj", UiConfigViews.as_view({'get': 'new_browser_obj'})), - # - # path("case/result", UiCaseResultCRUD.as_view()), - # path("case/result/suite/get/case", UiCaseResultViews.as_view({'get': 'suite_get_case'})), - # path("result/week", UiCaseResultViews.as_view({'get': 'case_result_week_sum'})), - # - # path("ele/result", UiEleResultCRUD.as_view()), - # path("ele/result/ele", UiEleResultViews.as_view({'get': 'get_ele_result'})), ] diff --git a/MangoServer/PyAutoTest/auto_test/auto_ui/views/ui_element.py b/MangoServer/PyAutoTest/auto_test/auto_ui/views/ui_element.py index fcb4c72f..2b2fcfda 100644 --- a/MangoServer/PyAutoTest/auto_test/auto_ui/views/ui_element.py +++ b/MangoServer/PyAutoTest/auto_test/auto_ui/views/ui_element.py @@ -75,7 +75,11 @@ class PageElementViews(ViewSet): 获取所有的页面名称 """ try: - SendTestData(request.user.get('id'), request.data.get("test_env")).test_element(request.data) + SendTestData( + request.user.get('id'), + request.data.get("test_env"), + is_send=request.data.get('is_send') + ).test_element(request.data) except MangoServerError as error: return ResponseData.fail((error.code, error.msg)) return ResponseData.success(RESPONSE_MSG_0081, value=(ClientNameEnum.DRIVER.value,)) diff --git a/MangoServer/PyAutoTest/models/api_model.py b/MangoServer/PyAutoTest/models/api_model.py index 515b8bf2..0d73d4fe 100644 --- a/MangoServer/PyAutoTest/models/api_model.py +++ b/MangoServer/PyAutoTest/models/api_model.py @@ -14,7 +14,7 @@ class ApiCaseModel(BaseModel): case_id: int test_env: int user_id: int - tasks_id: int + tasks_id: int | None = None class RequestDataModel(BaseModel): @@ -63,6 +63,8 @@ class ApiCaseStepsResultModel(BaseModel): """接口结果""" id: int name: str + status: int + error_message: str | None = None ass: list[AssResultModel] request: RequestDataModel response: ResponseDataModel diff --git a/MangoServer/PyAutoTest/models/ui_model.py b/MangoServer/PyAutoTest/models/ui_model.py index 4531d71c..a2cabc2d 100644 --- a/MangoServer/PyAutoTest/models/ui_model.py +++ b/MangoServer/PyAutoTest/models/ui_model.py @@ -145,4 +145,4 @@ class UiCaseResultModel(BaseModel): status: int error_message: str | None = None video_path: str | None = None - page_steps_result: list[PageStepsResultModel] + steps: list[PageStepsResultModel] diff --git a/MangoServer/PyAutoTest/settings/__init__.py b/MangoServer/PyAutoTest/settings/__init__.py index 7a780f2b..c1f9e2b5 100644 --- a/MangoServer/PyAutoTest/settings/__init__.py +++ b/MangoServer/PyAutoTest/settings/__init__.py @@ -32,7 +32,7 @@ INIT_MANGO_TESTING_PLATFORM = False # 可以初始化部分原始数据,快 USE_TZ = False TIME_ZONE = 'Asia/Shanghai' -DEBUG = True +DEBUG = False ALLOWED_HOSTS = ["*"] SECRET_KEY = 'django-insecure-)7248+$v^i-e@u$=+jzwl1u(vvw0d$n5mepritgniru(&8gmu1' diff --git a/author.jpg b/author.jpg new file mode 100644 index 00000000..79cfe98c Binary files /dev/null and b/author.jpg differ diff --git a/group.jpg b/group.jpg new file mode 100644 index 00000000..7089793e Binary files /dev/null and b/group.jpg differ