执行器修改完成,后面会把web端同步修改

This commit is contained in:
毛鹏
2024-11-27 17:56:59 +08:00
parent 368ab45c24
commit 7dcff6ef54
38 changed files with 385 additions and 207 deletions

View File

@@ -1,8 +1,7 @@
playwright==1.46.0 playwright==1.47.0
uiautomator2==3.2.2 uiautomator2==3.2.5
pywinauto==0.6.8 pywinauto==0.6.8
uiautodev==0.4.0 uiautodev==0.5.0
weditor==0.6.4
locust locust
mangokit==1.1.37 mangokit==1.1.37
mangoui==3.0.10 mangoui==3.0.10

View File

@@ -6,7 +6,7 @@
import aiohttp import aiohttp
from aiohttp.client_exceptions import ClientResponse 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.services.api.service.case_run import ApiCaseRun
from src.tools.decorator.convert_args import convert_args from src.tools.decorator.convert_args import convert_args
@@ -14,8 +14,8 @@ from src.tools.decorator.convert_args import convert_args
class API: class API:
api = ApiCaseRun() api = ApiCaseRun()
@convert_args(RequestModel) @convert_args(ResponseDataModel)
async def a_api_info(self, data: RequestModel): async def a_api_info(self, data: ResponseDataModel):
response: ClientResponse | None = None response: ClientResponse | None = None
time = None time = None
session = aiohttp.ClientSession() session = aiohttp.ClientSession()
@@ -23,6 +23,6 @@ class API:
await session.close() await session.close()
@classmethod @classmethod
@convert_args(RequestModel) @convert_args(ResponseDataModel)
async def a_api_case(cls, data: RequestModel): async def a_api_case(cls, data: ResponseDataModel):
pass pass

View File

@@ -2,60 +2,39 @@
# @Project: 芒果测试平台 # @Project: 芒果测试平台
# @Description: # @Time : 2022-12-04 17:14 # @Description: # @Time : 2022-12-04 17:14
# @Author : 毛鹏 # @Author : 毛鹏
from typing import Any
from pydantic import BaseModel from pydantic import BaseModel
class RequestModel(BaseModel): class ApiCaseModel(BaseModel):
"""请求""" test_suite_details: int
test_suite: int
case_id: int case_id: int
case_name: str test_env: int
url: str user_id: int
method: str tasks_id: int
header: str | None
body_type: int = None
body: dict | str = None
class ApiCaseGroupModel(BaseModel): class RequestDataModel(BaseModel):
group_name: str method: str | None
case_group_list: list[RequestModel] 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): class ResponseDataModel(BaseModel):
end: int status_code: 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
response_time: float response_time: float
res_code: int response_headers: dict
body_type: int = None response_json: dict | None = None
body: dict = None response_text: str | None = None
response: dict
assertion_res: bool = None
class ApiPublicModel(BaseModel): class RecordingApiModel(BaseModel):
"""api公共"""
project_id: int
client: int
public_type: int
name: str
key: str
value: str
status: int
type: int
class ApiInfoModel(BaseModel):
"""ApiInfo模型""" """ApiInfo模型"""
project_product: int project_product: int
username: str username: str
@@ -71,3 +50,49 @@ class ApiInfoModel(BaseModel):
json_data: list | dict | None = None json_data: list | dict | None = None
file: str | None = None file: str | None = None
status: int | 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] = []

View File

@@ -144,7 +144,7 @@ class UiCaseResultModel(BaseModel):
status: int status: int
error_message: str | None = None error_message: str | None = None
video_path: str | None = None video_path: str | None = None
page_steps_result: list[PageStepsResultModel] = [] steps: list[PageStepsResultModel] = []
class PageObject: class PageObject:

View File

@@ -27,7 +27,3 @@ class Home(HttpBase):
def case_sum(cls): def case_sum(cls):
return requests.get(cls.url(f'{Home._url}/case/sum'), cls.headers) 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)

View File

@@ -37,3 +37,7 @@ class TestSuiteDetails(HttpBase):
@request_log() @request_log()
def delete_test_suite_details(cls, _id, ): def delete_test_suite_details(cls, _id, ):
return cls.delete(url=cls.url(TestSuiteDetails._url), headers=cls.headers, params={'id': _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, )

View File

@@ -54,6 +54,7 @@ class Element(HttpBase):
'type': _type, 'type': _type,
'ope_key': ope_key, 'ope_key': ope_key,
'ope_value': ope_value, 'ope_value': ope_value,
'is_send': True
} }
return cls.post(url=f'{url}/test', headers=cls.headers, json=json_data) return cls.post(url=f'{url}/test', headers=cls.headers, json=json_data)

View File

@@ -3,9 +3,8 @@
# @Description: # @Description:
# @Time : 2024-08-28 16:30 # @Time : 2024-08-28 16:30
# @Author : 毛鹏 # @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.socket_model import ResponseModel
from src.models.user_model import UserModel from src.models.user_model import UserModel
from .case_dict import * from .case_dict import *
@@ -48,3 +47,11 @@ class ApiCasePage(TableParent):
def run(self, row): def run(self, row):
user_info = UserModel() user_info = UserModel()
response_message(self, HTTP.get_api_test_case(row.get("id"), user_info.selected_environment, )) 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, ))

View File

@@ -44,7 +44,8 @@ search_data = [
} }
] ]
right_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 = [ form_data = [

View File

@@ -6,6 +6,7 @@
from src.network import HTTP from src.network import HTTP
from src.pages.parent.sub import SubPage from src.pages.parent.sub import SubPage
from src.tools.methods import Methods
from .module_dict import * from .module_dict import *
@@ -24,3 +25,7 @@ class ModulePage(SubPage):
self.post = HTTP.post_module self.post = HTTP.post_module
self.put = HTTP.put_module self.put = HTTP.put_module
self._delete = HTTP.delete_module self._delete = HTTP.delete_module
def show_data(self, is_refresh=False):
super().show_data()
Methods.set_project()

View File

@@ -38,13 +38,13 @@ class TestSuitePage(TableParent):
self.layout_v.addWidget(self.table_widget, 7) self.layout_v.addWidget(self.table_widget, 7)
def show_data(self, is_refresh=False): def show_data(self, is_refresh=False):
response_model = HTTP.result_week() response_model = HTTP.get_test_suite_report()
# self.line_plot_1.draw([ self.line_plot_1.draw([
# {'name': '成功', 'value': response_model.data.get('success')}, {'name': '成功', 'value': response_model.data.get('success')},
# {'name': '失败', 'value': response_model.data.get('fail')} {'name': '失败', 'value': response_model.data.get('fail')}
# ]) ])
# self.pie_plot_1.draw([ self.pie_plot_1.draw([
# {'name': '失败数', 'value': response_model.data.get('failSun')}, {'name': '失败数', 'value': response_model.data.get('failSun')},
# {'name': '成功数', 'value': response_model.data.get('successSun')} {'name': '成功数', 'value': response_model.data.get('successSun')}
# ]) ])
super().show_data(is_refresh) super().show_data(is_refresh)

View File

@@ -3,18 +3,18 @@
# @Description: # @Description:
# @Time : 2024-09-01 下午9:01 # @Time : 2024-09-01 下午9:01
# @Author : 毛鹏 # @Author : 毛鹏
import json
from mango_ui import * from mango_ui import *
from src.enums.api_enum import MethodEnum from src.enums.tools_enum import Status3Enum, StatusEnum, TaskEnum
from src.enums.tools_enum import Status3Enum, StatusEnum
from src.network import HTTP from src.network import HTTP
from src.pages.parent.sub import SubPage from src.pages.parent.sub import SubPage
from .test_suite_detailed_dict import * from .test_suite_detailed_dict import *
from ...enums.system_enum import AutoTestTypeEnum from ...enums.system_enum import AutoTestTypeEnum
from ...enums.ui_enum import ElementOperationEnum from ...enums.ui_enum import ElementOperationEnum
from ...models.api_model import ApiCaseStepsResultModel
from ...models.socket_model import ResponseModel from ...models.socket_model import ResponseModel
from ...models.ui_model import PageStepsResultModel
class TestSuiteDetailedPage(SubPage): class TestSuiteDetailedPage(SubPage):
@@ -32,25 +32,46 @@ class TestSuiteDetailedPage(SubPage):
self.mango_tree = MangoTree('测试套') self.mango_tree = MangoTree('测试套')
self.mango_tree.clicked.connect(self.mango_tree_click) self.mango_tree.clicked.connect(self.mango_tree_click)
self.layout_v_1.addWidget(self.mango_tree) 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.layout_v_2 = MangoVBoxLayout()
self.scroll_area = MangoScrollArea() self.scroll_area = MangoScrollArea()
self.layout_v_2.addWidget(self.scroll_area) 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): def show_data(self, is_refresh=False):
if self.field_list: if self.field_list:
self.title_info.init(self.data, self.field_list) self.title_info.init(self.data, self.field_list)
if self.data.get('type') == AutoTestTypeEnum.UI.value: response_model: ResponseModel = HTTP.get_test_suite_details(
response_model: ResponseModel = HTTP.suite_get_case(self.data.get('id')) page=1,
else: page_size=10000,
response_model: ResponseModel = HTTP.get_api_result_suite_case(self.data.get('id')) params={f'{self.id_key}_id': self.data.get('id')}
self.mango_tree.set_item([TreeModel(**i) for i in response_model.data.get('data')]) )
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: if response_model.code != 200:
response_message(self, response_model) response_message(self, response_model)
return response_model return response_model
def mango_tree_click(self, data: TreeModel): 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: if self.data.get('type') == AutoTestTypeEnum.UI.value:
self.set_ui(data) self.set_ui(data)
else: else:
@@ -58,7 +79,6 @@ class TestSuiteDetailedPage(SubPage):
def set_api(self, data: TreeModel): def set_api(self, data: TreeModel):
WidgetTool.remove_layout(self.scroll_area.layout) WidgetTool.remove_layout(self.scroll_area.layout)
mango_tabs = MangoTabs() mango_tabs = MangoTabs()
self.scroll_area.layout.addWidget(mango_tabs) self.scroll_area.layout.addWidget(mango_tabs)
layout_request = MangoHBoxLayout() layout_request = MangoHBoxLayout()
@@ -102,62 +122,60 @@ class TestSuiteDetailedPage(SubPage):
layout_ass.setAlignment(Qt.AlignTop) # type: ignore layout_ass.setAlignment(Qt.AlignTop) # type: ignore
mango_tabs.add_tab(layout_ass, '断言信息') mango_tabs.add_tab(layout_ass, '断言信息')
response_data = HTTP.get_api_info_result(params={'id': int(data.key.split("-")[1])}) layout_cache = MangoHBoxLayout()
response_data = response_data.data[0] if response_data.data else {} layout_cache.setAlignment(Qt.AlignTop) # type: ignore
request_info.addWidget(MangoLabel(f'接口ID{response_data.get("api_info").get("id")}')) mango_tabs.add_tab(layout_cache, '缓存信息')
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"))))
response_info.addWidget(MangoLabel(f'CODE{response_data.get("response_code")}')) response_data = ApiCaseStepsResultModel(**data.data)
response_info.addWidget(MangoLabel(f'响应时间{response_data.get("response_code")}')) request_info.addWidget(MangoLabel(f'接口ID{response_data.id}'))
response_info.addWidget(MangoLabel(f'测试结果{Status3Enum.get_value(response_data.get("status"))}')) request_info.addWidget(MangoLabel(f'接口名称{response_data.name}'))
response_info.addWidget(MangoLabel(f'失败提示{response_data.get("error_message")}')) request_info.addWidget(MangoLabel(f'请求方法{response_data.request.method}'))
response_headers.addWidget(MangoTextEdit('', WidgetTool.json_init_data(response_data.get("response_headers")))) request_info.addWidget(MangoLabel(f'接口URL{response_data.request.url}'))
response_body.addWidget(MangoTextEdit('', WidgetTool.json_init_data(response_data.get("response_text")))) request_headers.addWidget(MangoTextEdit('', WidgetTool.json_init_data(response_data.request.headers)))
layout_ass.addWidget(MangoLabel(f'{response_data.get("assertion")}')) 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): def set_ui(self, data: TreeModel):
data_key = json.loads(data.key) response_data = PageStepsResultModel(**data.data)
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'))
WidgetTool.remove_layout(self.scroll_area.layout) WidgetTool.remove_layout(self.scroll_area.layout)
for item in response_data.data: for element_data in response_data.element_result_list:
element_data: dict | None = item['element_data']
layout = MangoGridLayout() layout = MangoGridLayout()
card = MangoCard(layout) card = MangoCard(layout)
layout.addWidget(MangoLabel(f"元素名称: {item['ele_name']}"), 0, 0) layout.addWidget(MangoLabel(f"元素名称: {element_data.name}"), 0, 0)
if element_data: layout.addWidget(MangoLabel(f"状态: {Status3Enum.get_value(element_data.status)}"), 0, 1)
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.get('ele_quantity')}"), 0, 2) layout.addWidget(MangoLabel(f"操作类型: {element_data.loc}"), 1, 0)
layout.addWidget(MangoLabel(f"操作类型: {element_data.get('loc')}"), 1, 0) layout.addWidget(MangoLabel(f"定位方式: {element_data.exp}"), 1, 1)
layout.addWidget(MangoLabel(f"定位方式: {element_data.get('exp')}"), 1, 1) layout.addWidget(MangoLabel(f"等待时间: {element_data.sleep}"), 1, 2)
layout.addWidget(MangoLabel(f"等待时间: {element_data.get('sleep')}"), 1, 2) layout.addWidget(MangoLabel(f"元素下标: {element_data.sub}"), 2, 0)
layout.addWidget(MangoLabel(f"元素下标: {element_data.get('sub')}"), 2, 0) if element_data.type == ElementOperationEnum.OPE.value:
if element_data.get("type") == ElementOperationEnum.OPE.value: layout.addWidget(MangoLabel(f"操作类型: {element_data.ope_key}"), 3, 0)
layout.addWidget(MangoLabel(f"操作类型: {element_data.get('ope_key')}"), 3, 0) layout.addWidget(MangoLabel(f"操作数据: {element_data.ope_value}"), 3, 1)
layout.addWidget(MangoLabel(f"操作数据: {element_data.get('ope_value')}"), 3, 1) elif element_data.type == ElementOperationEnum.ASS.value:
elif element_data.get("type") == ElementOperationEnum.ASS.value: layout.addWidget(MangoLabel(f"断言类型: {element_data.ope_key}"), 3, 0)
layout.addWidget(MangoLabel(f"断言类型: {element_data.get('ope_key')}"), 3, 0) layout.addWidget(MangoLabel(f"断言数据: {element_data.ope_value}"), 3, 1)
layout.addWidget(MangoLabel(f"断言数据: {element_data.get('ope_value')}"), 3, 1) layout.addWidget(
layout.addWidget( MangoLabel(f"预期: {element_data.expect},期望:{element_data.actual}"), 3, 2)
MangoLabel(f"预期: {element_data.get('expect')},期望:{element_data.get('actual')}"), 3, 2) elif element_data.type == ElementOperationEnum.SQL.value:
elif element_data.get("type") == ElementOperationEnum.SQL.value: layout.addWidget(MangoLabel(f"SQL: {element_data.sql}"), 3, 0)
layout.addWidget(MangoLabel(f"SQL: {element_data.get('sql')}"), 3, 0) layout.addWidget(MangoLabel(f"SQL_KEY: {element_data.key_list}"), 3, 1)
layout.addWidget(MangoLabel(f"SQL_KEY: {element_data.get('key_list')}"), 3, 1) else:
else: layout.addWidget(MangoLabel(f"key: {element_data.key}"), 3, 0)
layout.addWidget(MangoLabel(f"key: {element_data.get('key')}"), 3, 0) layout.addWidget(MangoLabel(f"value: {element_data.value}"), 3, 1)
layout.addWidget(MangoLabel(f"value: {element_data.get('value')}"), 3, 1)
if element_data['status'] == StatusEnum.FAIL.value: if element_data.status == StatusEnum.FAIL.value:
layout.addWidget(MangoLabel(f"失败截图: {element_data.get('picture_path')}"), 4, 0) layout.addWidget(MangoLabel(f"失败截图: {element_data.picture_path}"), 4, 0)
layout.addWidget(MangoLabel(f"失败截图: {element_data.get('error_message')}"), 4, 1) layout.addWidget(MangoLabel(f"失败截图: {element_data.error_message}"), 4, 1)
self.scroll_area.layout.addWidget(card) self.scroll_area.layout.addWidget(card)

View File

@@ -6,14 +6,13 @@
from mango_ui import THEME from mango_ui import THEME
right_data = [ right_data = [
{'name': '刷新', 'theme': THEME.group.info, 'action': 'show_data'},
{'name': '返回', 'theme': THEME.group.warning, 'action': 'back'} {'name': '返回', 'theme': THEME.group.warning, 'action': 'back'}
] ]
field_list = [ field_list = [
{'key': 'id', 'name': '测试套ID'}, {'key': 'id', 'name': '测试套ID'},
{'key': 'project_product', 'name': '项目名称'}, {'key': 'project', 'name': '项目名称'},
{'key': 'create_time', 'name': '执行时间'}, {'key': 'create_time', 'name': '执行时间'},
{'key': 'status', 'name': '测试结果'}, {'key': 'status', 'name': '测试结果'},
{'key': 'test_env', 'name': '测试环境'}, {'key': 'test_env', 'name': '测试环境'},
{'key': 'run_status', 'name': '执行状态'},
{'key': 'error_message', 'name': '失败消息'},
] ]

View File

@@ -5,7 +5,7 @@
# @Author : 毛鹏 # @Author : 毛鹏
from mango_ui import response_message, DialogCallbackModel, ComboBoxDataModel, FormDataModel 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.network import HTTP
from src.pages.parent.sub import SubPage from src.pages.parent.sub import SubPage
from .task_case_dict import * from .task_case_dict import *

View File

@@ -9,7 +9,6 @@ import uuid
from mango_ui import * from mango_ui import *
from src.enums.ui_enum import DriveTypeEnum, ElementOperationEnum from src.enums.ui_enum import DriveTypeEnum, ElementOperationEnum
from src.models.api_model import ResponseModel
from src.models.user_model import UserModel from src.models.user_model import UserModel
from src.network import HTTP from src.network import HTTP
from src.tools.get_class_methods import GetClassMethod from src.tools.get_class_methods import GetClassMethod

View File

@@ -9,7 +9,7 @@ import json
from mango_ui import * from mango_ui import *
from src.enums.ui_enum import DriveTypeEnum 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.ui_model import PageStepsModel, ElementResultModel, PageObject
from src.models.user_model import UserModel from src.models.user_model import UserModel
from src.services.ui.service.test_page_steps import TestPageSteps from src.services.ui.service.test_page_steps import TestPageSteps
@@ -49,32 +49,31 @@ class PageStepsDetailedPage(SubPage):
self.select_data = None self.select_data = None
def update_card(self, ele_model: ElementResultModel): def update_card(self, ele_model: ElementResultModel):
WidgetTool.remove_layout(self.scroll_area.layout)
layout = MangoGridLayout() layout = MangoGridLayout()
card = MangoCard(layout) card = MangoCard(layout)
labels = [ labels = [
f"元素名称: {ele_model.ele_name}", f"元素名称: {ele_model.name}",
f"元素数量: {ele_model.element_data.ele_quantity}", f"元素数量: {ele_model.ele_quantity}",
f"测试结果: {'成功' if ele_model.element_data.status else '失败'}", f"测试结果: {'成功' if ele_model.status else '失败'}",
] ]
if ele_model.element_data.type == ElementOperationEnum.OPE.value: if ele_model.type == ElementOperationEnum.OPE.value:
labels.append(f"操作类型: {ele_model.element_data.ope_key}") labels.append(f"操作类型: {ele_model.ope_key}")
elif ele_model.element_data.type == ElementOperationEnum.ASS.value: elif ele_model.type == ElementOperationEnum.ASS.value:
labels.append(f"断言类型: {ele_model.element_data.ope_key}") labels.append(f"断言类型: {ele_model.ope_key}")
labels.append(f"预期值: {ele_model.element_data.expect}") labels.append(f"预期值: {ele_model.expect}")
labels.append(f"实际值: {ele_model.element_data.actual}") labels.append(f"实际值: {ele_model.actual}")
elif ele_model.element_data.type == ElementOperationEnum.SQL.value: elif ele_model.type == ElementOperationEnum.SQL.value:
labels.append(f"sql_key: {ele_model.element_data.key_list}") labels.append(f"sql_key: {ele_model.key_list}")
labels.append(f"sql语句: {ele_model.element_data.sql}") labels.append(f"sql语句: {ele_model.sql}")
elif ele_model.element_data.type == ElementOperationEnum.CUSTOM.value: elif ele_model.type == ElementOperationEnum.CUSTOM.value:
labels.append(f"参数key: {ele_model.element_data.key}") labels.append(f"参数key: {ele_model.key}")
labels.append(f"参数value: {ele_model.element_data.value}") labels.append(f"参数value: {ele_model.value}")
labels.append(f"元素表达式: {ele_model.element_data.loc}") labels.append(f"元素表达式: {ele_model.loc}")
if ele_model.element_data.status == StatusEnum.FAIL.value: if ele_model.status == StatusEnum.FAIL.value:
labels.append(f"失败提示:{ele_model.element_data.error_message}") labels.append(f"失败提示:{ele_model.error_message}")
labels.append(f"失败截图: {ele_model.element_data.picture_path}") labels.append(f"失败截图: {ele_model.picture_path}")
# 添加3行3列的数据 # 添加3行3列的数据
for row in range(3): for row in range(3):
@@ -87,13 +86,14 @@ class PageStepsDetailedPage(SubPage):
self.scroll_area.layout.addWidget(card) self.scroll_area.layout.addWidget(card)
def debug(self): def debug(self):
WidgetTool.remove_layout(self.scroll_area.layout)
user_info = UserModel() user_info = UserModel()
response_model: ResponseModel = HTTP.ui_steps_run(user_info.selected_environment, self.data.get("id"), 0) response_model: ResponseModel = HTTP.ui_steps_run(user_info.selected_environment, self.data.get("id"), 0)
response_message(self, response_model) response_message(self, response_model)
if response_model.code == 200: if response_model.code == 200:
data = PageStepsModel(**response_model.data) data = PageStepsModel(**response_model.data)
if PageObject.test_page_steps is None: 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) PageObject.test_page_steps.progress.connect(self.update_card)
asyncio.run_coroutine_threadsafe( asyncio.run_coroutine_threadsafe(
PageObject.test_page_steps.page_steps_mian(data), self.parent.loop) PageObject.test_page_steps.page_steps_mian(data), self.parent.loop)

View File

@@ -7,7 +7,7 @@
from aiohttp import ClientSession from aiohttp import ClientSession
from aiohttp.client_reqrep import ClientResponse 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.services.api.base_tools.http_request import HTTPRequest
from src.tools.log_collector import log from src.tools.log_collector import log
@@ -18,7 +18,7 @@ class Dependence:
class ApiCaseRun(HTTPRequest, 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 pass
async def get_header(self) -> str: async def get_header(self) -> str:

View File

@@ -8,6 +8,7 @@ from typing import Optional
import uiautomator2 as u2 import uiautomator2 as u2
from adbutils import AdbTimeout from adbutils import AdbTimeout
from uiautomator2 import ConnectError
from src.exceptions import * from src.exceptions import *
from src.models.ui_model import EquipmentModel from src.models.ui_model import EquipmentModel
@@ -29,19 +30,22 @@ class NewAndroid:
def new_android(self): def new_android(self):
if self.config is None: if self.config is None:
raise UiError(*ERROR_MSG_0042) 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: try:
android = u2.connect(self.config.and_equipment)
self.info = android.info
msg = f"设备启动成功!产品名称:{self.info.get('productName')}" 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: except RuntimeError:
raise UiError(*ERROR_MSG_0045, value=(self.config.equipment,)) raise UiError(*ERROR_MSG_0045, value=(self.config.and_equipment,))
except (AdbTimeout, TimeoutError): except (AdbTimeout, TimeoutError):
raise UiError(*ERROR_MSG_0047, value=(self.config.equipment,)) raise UiError(*ERROR_MSG_0047, value=(self.config.and_equipment,))
else: else:
android.implicitly_wait(10) android.implicitly_wait(10)
return android return android

View File

@@ -64,6 +64,7 @@ class PageSteps(ElementOperation):
return self.page_step_result_model return self.page_step_result_model
def end_set(self, element_result): 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.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.test_object = {'url': self.url, 'package_name': self.package_name}
self.page_step_result_model.equipment = {'name': self.driver_object.web.config} self.page_step_result_model.equipment = {'name': self.driver_object.web.config}

View File

@@ -3,7 +3,6 @@
# @Description: # @Time : 2023/5/4 14:33 # @Description: # @Time : 2023/5/4 14:33
# @Author : 毛鹏 # @Author : 毛鹏
import asyncio
import json import json
import os import os
import shutil import shutil
@@ -75,7 +74,7 @@ class TestCase(PageSteps):
await self.driver_init() await self.driver_init()
page_steps_result_model = await self.steps_main() page_steps_result_model = await self.steps_main()
self.case_result \ self.case_result \
.page_steps_result \ .steps \
.append(page_steps_result_model) .append(page_steps_result_model)
self.case_result.status = StatusEnum.SUCCESS.value self.case_result.status = StatusEnum.SUCCESS.value
except MangoActuatorError as error: except MangoActuatorError as error:
@@ -86,9 +85,8 @@ class TestCase(PageSteps):
except Exception as error: except Exception as error:
traceback.print_exc() traceback.print_exc()
log.error(error) log.error(error)
self.case_result.status = StatusEnum.SUCCESS.value self.case_result.status = StatusEnum.FAIL.value
await self.send_case_result( self.case_result = f'发生未知错误,请联系管理员检查测试用例数据,用例名称:{self.case_model.name}'
f'发生未知错误,请联系管理员检查测试用例数据,用例名称:{self.case_model.name}')
break break
try: try:
await self.case_posterior(self.case_model.posterior_sql) await self.case_posterior(self.case_model.posterior_sql)
@@ -96,8 +94,7 @@ class TestCase(PageSteps):
traceback.print_exc() traceback.print_exc()
log.error(error) log.error(error)
self.case_result.status = StatusEnum.SUCCESS.value self.case_result.status = StatusEnum.SUCCESS.value
await self.send_case_result( self.case_result = f'初始化用例后置数据发生未知异常,请联系管理员来解决,用例名称:{self.case_model.name}'
f'初始化用例后置数据发生未知异常,请联系管理员来解决,用例名称:{self.case_model.name}')
await self.send_case_result( await self.send_case_result(
self.case_result.error_message if self.case_result.error_message else f'用例<{self.case_model.name}>测试完成' self.case_result.error_message if self.case_result.error_message else f'用例<{self.case_model.name}>测试完成'
) )

View File

@@ -5,7 +5,7 @@ from mango_ui import AppConfig, MenusModel
from src.tools import InitPath from src.tools import InitPath
IS_DEBUG = True IS_DEBUG = False
MEMORY_THRESHOLD = 100 MEMORY_THRESHOLD = 100

View File

@@ -31,6 +31,12 @@ class CaseFlow:
future = self.executor.submit(self.execute_task, case_model) future = self.executor.submit(self.execute_task, case_model)
self.futures.append(future) self.futures.append(future)
for future in as_completed(self.futures): 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) self.futures.remove(future)
time.sleep(0.1) time.sleep(0.1)
except Exception as error: except Exception as error:
@@ -39,16 +45,20 @@ class CaseFlow:
@classmethod @classmethod
def execute_task(cls, case_model: ApiCaseModel): def execute_task(cls, case_model: ApiCaseModel):
from PyAutoTest.auto_test.auto_api.service.api_call.test_case import TestCase try:
test_case = TestCase( from PyAutoTest.auto_test.auto_api.service.api_call.test_case import TestCase
user_id=case_model.user_id, test_case = TestCase(
test_env=case_model.test_env, user_id=case_model.user_id,
tasks_id=case_model.tasks_id, test_env=case_model.test_env,
test_suite=case_model.test_suite, tasks_id=case_model.tasks_id,
test_suite_details=case_model.test_suite_details, test_suite=case_model.test_suite,
is_send=False, 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 @classmethod
def add_task(cls, case_model: ApiCaseModel): def add_task(cls, case_model: ApiCaseModel):

View File

@@ -61,7 +61,7 @@ class TestCase(CaseDetailedInit):
self.init_case_posterior(api_case) self.init_case_posterior(api_case)
self.api_case_result.status = self.status.value self.api_case_result.status = self.status.value
self.update_test_case(case_id, self.status) 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( UpdateTestSuite.update_test_suite_details(TestSuiteDetailsResultModel(
id=self.test_suite_details, id=self.test_suite_details,
test_suite=self.test_suite, test_suite=self.test_suite,
@@ -69,7 +69,7 @@ class TestCase(CaseDetailedInit):
error_message=self.error_message, error_message=self.error_message,
result_data=self.api_case_result result_data=self.api_case_result
)) ))
return self.api_case_result.model_dump() return self.api_case_result.model_dump()
except Exception as error: except Exception as error:
traceback.print_exc() traceback.print_exc()
log.api.error(f'API用例执行过程中发生异常{error}') log.api.error(f'API用例执行过程中发生异常{error}')
@@ -118,7 +118,6 @@ class TestCase(CaseDetailedInit):
json_data=data.json, json_data=data.json,
file=data.file file=data.file
)) ))
return request_data_model return request_data_model
def case_steps_posterior( def case_steps_posterior(
@@ -131,6 +130,8 @@ class TestCase(CaseDetailedInit):
api_case_steps_result = ApiCaseStepsResultModel( api_case_steps_result = ApiCaseStepsResultModel(
id=data.api_info.id, id=data.api_info.id,
name=data.api_info.name, name=data.api_info.name,
status=self.status.value,
error_message=self.error_message,
ass=ass, ass=ass,
request=request, request=request,
response=response, response=response,

View File

@@ -34,7 +34,7 @@ class CaseBase(ObtainTestData, BaseRequest):
self.project_product_id = None self.project_product_id = None
self.status = StatusEnum.FAIL self.status = StatusEnum.SUCCESS
self.error_message = None self.error_message = None
self.test_object: Optional[None | TestObject] = None self.test_object: Optional[None | TestObject] = None

View File

@@ -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'),
),
]

View File

@@ -194,6 +194,7 @@ class TestSuiteDetails(models.Model):
project_product = models.ForeignKey(to=ProjectProduct, to_field="id", on_delete=models.SET_NULL, null=True) project_product = models.ForeignKey(to=ProjectProduct, to_field="id", on_delete=models.SET_NULL, null=True)
test_env = models.SmallIntegerField(verbose_name="测试环境") test_env = models.SmallIntegerField(verbose_name="测试环境")
case_id = models.SmallIntegerField(verbose_name="用例ID") case_id = models.SmallIntegerField(verbose_name="用例ID")
case_name = models.CharField(verbose_name="key", max_length=528, null=True) # 制作展示用
# 2待开始3是进行中0是失败1是成功 # 2待开始3是进行中0是失败1是成功
status = models.SmallIntegerField(verbose_name="测试结果") status = models.SmallIntegerField(verbose_name="测试结果")
error_message = models.TextField(verbose_name="错误提示", null=True) error_message = models.TextField(verbose_name="错误提示", null=True)

View File

@@ -51,7 +51,7 @@ def consumer():
case_id=test_suite_details.case_id, case_id=test_suite_details.case_id,
test_env=test_suite_details.test_env, test_env=test_suite_details.test_env,
user_id=test_suite.user.id, 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) CaseFlow().add_task(api_case_model)
log.system.info(f"推送API任务成功用例数据{api_case_model.model_dump_json()}") log.system.info(f"推送API任务成功用例数据{api_case_model.model_dump_json()}")

View File

@@ -37,7 +37,6 @@ class AddTasks:
}) })
def add_test_suite_details(self, case_id_list: list[id]): def add_test_suite_details(self, case_id_list: list[id]):
for case_id in case_id_list: for case_id in case_id_list:
if self._type == AutoTestTypeEnum.UI.value: if self._type == AutoTestTypeEnum.UI.value:
case = UiCase.objects.get(id=case_id) case = UiCase.objects.get(id=case_id)
@@ -49,6 +48,7 @@ class AddTasks:
'project_product': case.project_product.id, 'project_product': case.project_product.id,
'test_env': self.test_env, 'test_env': self.test_env,
'case_id': case_id, 'case_id': case_id,
'case_name': case.name,
'status': TaskEnum.STAY_BEGIN.value, 'status': TaskEnum.STAY_BEGIN.value,
'error_message': None, 'error_message': None,
'result': None, 'result': None,

View File

@@ -29,7 +29,8 @@ class UpdateTestSuite:
connection.ensure_connection() connection.ensure_connection()
log.system.debug(f'开始更新测试套数据:{data.model_dump_json()}') log.system.debug(f'开始更新测试套数据:{data.model_dump_json()}')
test_suite_detail = TestSuiteDetails.objects.get(id=data.id) 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.status = data.status
test_suite_detail.error_message = data.error_message test_suite_detail.error_message = data.error_message
test_suite_detail.save() test_suite_detail.save()

View File

@@ -12,7 +12,7 @@ from .views.socket_api import SocketApiViews
from .views.tasks import TasksCRUD, TasksViews, TasksNoPermissionViews from .views.tasks import TasksCRUD, TasksViews, TasksNoPermissionViews
from .views.tasks_details import TasksDetailsCRUD, TasksDetailsViews from .views.tasks_details import TasksDetailsCRUD, TasksDetailsViews
from .views.test_suite import TestSuiteCRUD 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.database import DatabaseCRUD, DatabaseViews
from ..auto_system.views.index import IndexViews from ..auto_system.views.index import IndexViews
from ..auto_system.views.notice_config import NoticeConfigCRUD, NoticeConfigViews from ..auto_system.views.notice_config import NoticeConfigCRUD, NoticeConfigViews
@@ -55,6 +55,7 @@ urlpatterns = [
path('test/suite', TestSuiteCRUD.as_view()), path('test/suite', TestSuiteCRUD.as_view()),
# #
path('test/suite/details', TestSuiteDetailsCRUD.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/sum', IndexViews.as_view({'get': 'case_sum'})),
path('case/result/week/sum', IndexViews.as_view({'get': 'case_result_week_sum'})), path('case/result/week/sum', IndexViews.as_view({'get': 'case_result_week_sum'})),

View File

@@ -3,13 +3,18 @@
# @Description: # @Description:
# @Time : 2023-02-16 20:58 # @Time : 2023-02-16 20:58
# @Author : 毛鹏 # @Author : 毛鹏
from rest_framework import serializers from rest_framework import serializers
from rest_framework.decorators import action
from rest_framework.viewsets import ViewSet from rest_framework.viewsets import ViewSet
from PyAutoTest.auto_test.auto_system.models import TestSuiteDetails 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.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.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 from PyAutoTest.tools.view.model_crud import ModelCRUD
@@ -52,3 +57,89 @@ class TestSuiteDetailsCRUD(ModelCRUD):
class TestSuiteDetailsViews(ViewSet): class TestSuiteDetailsViews(ViewSet):
model = TestSuiteDetails model = TestSuiteDetails
serializer_class = TestSuiteDetailsSerializers 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)

View File

@@ -54,11 +54,4 @@ urlpatterns = [
path("config", UiConfigCRUD.as_view()), path("config", UiConfigCRUD.as_view()),
path("config/put/status", UiConfigViews.as_view({'put': 'put_status'})), path("config/put/status", UiConfigViews.as_view({'put': 'put_status'})),
path("config/new/browser/obj", UiConfigViews.as_view({'get': 'new_browser_obj'})), 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'})),
] ]

View File

@@ -75,7 +75,11 @@ class PageElementViews(ViewSet):
获取所有的页面名称 获取所有的页面名称
""" """
try: 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: except MangoServerError as error:
return ResponseData.fail((error.code, error.msg)) return ResponseData.fail((error.code, error.msg))
return ResponseData.success(RESPONSE_MSG_0081, value=(ClientNameEnum.DRIVER.value,)) return ResponseData.success(RESPONSE_MSG_0081, value=(ClientNameEnum.DRIVER.value,))

View File

@@ -14,7 +14,7 @@ class ApiCaseModel(BaseModel):
case_id: int case_id: int
test_env: int test_env: int
user_id: int user_id: int
tasks_id: int tasks_id: int | None = None
class RequestDataModel(BaseModel): class RequestDataModel(BaseModel):
@@ -63,6 +63,8 @@ class ApiCaseStepsResultModel(BaseModel):
"""接口结果""" """接口结果"""
id: int id: int
name: str name: str
status: int
error_message: str | None = None
ass: list[AssResultModel] ass: list[AssResultModel]
request: RequestDataModel request: RequestDataModel
response: ResponseDataModel response: ResponseDataModel

View File

@@ -145,4 +145,4 @@ class UiCaseResultModel(BaseModel):
status: int status: int
error_message: str | None = None error_message: str | None = None
video_path: str | None = None video_path: str | None = None
page_steps_result: list[PageStepsResultModel] steps: list[PageStepsResultModel]

View File

@@ -32,7 +32,7 @@ INIT_MANGO_TESTING_PLATFORM = False # 可以初始化部分原始数据,快
USE_TZ = False USE_TZ = False
TIME_ZONE = 'Asia/Shanghai' TIME_ZONE = 'Asia/Shanghai'
DEBUG = True DEBUG = False
ALLOWED_HOSTS = ["*"] ALLOWED_HOSTS = ["*"]
SECRET_KEY = 'django-insecure-)7248+$v^i-e@u$=+jzwl1u(vvw0d$n5mepritgniru(&8gmu1' SECRET_KEY = 'django-insecure-)7248+$v^i-e@u$=+jzwl1u(vvw0d$n5mepritgniru(&8gmu1'

BIN
author.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

BIN
group.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB