mirror of
https://gitee.com/mao-peng/MangoTestingPlatform.git
synced 2025-12-06 11:59:15 +08:00
执行器修改完成,后面会把web端同步修改
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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] = []
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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, )
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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, ))
|
||||
|
||||
@@ -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 = [
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.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.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)
|
||||
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.get('key')}"), 3, 0)
|
||||
layout.addWidget(MangoLabel(f"value: {element_data.get('value')}"), 3, 1)
|
||||
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)
|
||||
|
||||
@@ -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': '失败消息'},
|
||||
]
|
||||
|
||||
@@ -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 *
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
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
|
||||
})
|
||||
try:
|
||||
msg = f"设备启动成功!产品名称:{self.info.get('productName')}"
|
||||
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
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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}>测试完成'
|
||||
)
|
||||
|
||||
@@ -5,7 +5,7 @@ from mango_ui import AppConfig, MenusModel
|
||||
|
||||
from src.tools import InitPath
|
||||
|
||||
IS_DEBUG = True
|
||||
IS_DEBUG = False
|
||||
|
||||
MEMORY_THRESHOLD = 100
|
||||
|
||||
|
||||
@@ -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,6 +45,7 @@ class CaseFlow:
|
||||
|
||||
@classmethod
|
||||
def execute_task(cls, case_model: ApiCaseModel):
|
||||
try:
|
||||
from PyAutoTest.auto_test.auto_api.service.api_call.test_case import TestCase
|
||||
test_case = TestCase(
|
||||
user_id=case_model.user_id,
|
||||
@@ -48,7 +55,10 @@ class CaseFlow:
|
||||
test_suite_details=case_model.test_suite_details,
|
||||
is_send=False,
|
||||
)
|
||||
test_case.test_case(case_model.case_id)
|
||||
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):
|
||||
|
||||
@@ -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,
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'),
|
||||
),
|
||||
]
|
||||
@@ -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)
|
||||
|
||||
@@ -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()}")
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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'})),
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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'})),
|
||||
]
|
||||
|
||||
@@ -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,))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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'
|
||||
|
||||
BIN
author.jpg
Normal file
BIN
author.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 155 KiB |
Reference in New Issue
Block a user