18 KiB
2025-01-21 创建测试场景任务执行过程Feature
概述
为测试场景任务系统创建树形结构Feature,将三个核心表(tb_testscenario_task、tb_testscenario_task_execution_detail、tb_testscenario_task_execution_case_detail)组合生成层次化的树形结构,便于前端展示和管理。
主要变更
1. 创建 TestScenarioTaskTree Feature
- 目录:
X1.Application/Features/TestScenarioTaskTree/Queries/GetTestScenarioTaskTree/ - 功能: 提供测试场景任务执行过程查询功能
- 架构: 遵循CQRS模式,使用MediatR进行查询处理
2. 实现的功能组件
- 查询类:
GetTestScenarioTaskTreeQuery.cs- 定义查询参数和条件 - 响应类:
GetTestScenarioTaskTreeResponse.cs- 定义树形结构响应格式 - 处理器:
GetTestScenarioTaskTreeQueryHandler.cs- 实现树形结构构建逻辑 - DTO类: 包含任务树、执行树、用例树的数据传输对象
3. 树形结构设计
- 第一层: 测试场景任务(TestScenarioTaskTreeDto)
- 第二层: 任务执行详情(TaskExecutionTreeDto)
- 第三层: 用例执行详情(TaskExecutionCaseTreeDto)
4. 查询参数支持
- 场景过滤:
ScenarioCode- 按场景编码过滤 - 设备过滤:
DeviceCode- 按设备编码过滤 - 执行详情:
IncludeExecutionDetails- 是否包含执行详情 - 用例详情:
IncludeCaseDetails- 是否包含用例详情
5. 技术特点
- 性能优化: 支持按需加载,可选择是否包含执行和用例详情
- 数据完整性: 提供完整的统计信息(任务数量、执行数量、用例数量)
- 错误处理: 完整的异常处理和日志记录
- 类型安全: 强类型的DTO设计,确保数据一致性
技术实现
1. 查询类设计
public class GetTestScenarioTaskTreeQuery : IRequest<OperationResult<GetTestScenarioTaskTreeResponse>>
{
public string? ScenarioCode { get; set; }
public string? DeviceCode { get; set; }
public bool IncludeExecutionDetails { get; set; } = true;
public bool IncludeCaseDetails { get; set; } = true;
}
2. 树形结构DTO
- TestScenarioTaskTreeDto: 任务树节点,包含任务基本信息和执行列表
- TaskExecutionTreeDto: 执行树节点,包含执行信息和用例列表
- TaskExecutionCaseTreeDto: 用例树节点,包含用例执行详情
3. 处理器逻辑
- 分层构建: 先构建任务层,再构建执行层,最后构建用例层
- 按需加载: 根据参数决定是否加载执行和用例详情
- 统计计算: 自动计算各层级的数量统计
4. 数据关系
- 任务 → 执行: 一对多关系,通过TaskId关联
- 执行 → 用例: 一对多关系,通过ExecutionId关联
- 完整链路: 任务 → 执行详情 → 用例详情
使用场景
- 任务管理界面: 展示完整的任务执行层次结构
- 执行监控: 实时查看任务执行状态和进度
- 用例分析: 分析用例执行情况和性能数据
- 报告生成: 生成包含完整执行链路的报告
文件清单
Application Layer
X1.Application/Features/TestScenarioTaskTree/Queries/GetTestScenarioTaskTree/GetTestScenarioTaskTreeQuery.csX1.Application/Features/TestScenarioTaskTree/Queries/GetTestScenarioTaskTree/GetTestScenarioTaskTreeResponse.csX1.Application/Features/TestScenarioTaskTree/Queries/GetTestScenarioTaskTree/GetTestScenarioTaskTreeQueryHandler.cs
Presentation Layer
X1.Presentation/Controllers/TestScenarioTaskExecutionController.cs
Frontend Layer
X1.WebUI/src/services/testScenarioTaskExecutionService.ts- 任务执行过程服务X1.WebUI/src/pages/task-execution-process/TaskExecutionProcessView.tsx- 任务执行过程主视图组件X1.WebUI/src/pages/task-execution-process/TaskExecutionTree.tsx- 左侧树形结构组件X1.WebUI/src/pages/task-execution-process/TaskExecutionTable.tsx- 右侧表格组件X1.WebUI/src/components/ui/collapsible.tsx- 可折叠组件(新增)X1.WebUI/src/constants/api.ts- 更新API常量配置X1.WebUI/src/constants/navigationMenuPresets.ts- 更新导航菜单预设配置X1.WebUI/src/pages/navigation-menus/NavigationMenuForm_Examples.md- 更新导航菜单示例文档X1.WebUI/src/routes/AppRouter.tsx- 添加任务执行过程页面路由配置
Controller实现
1. 控制器设计
- 基类: 继承自
ApiController基类 - 路由:
api/testscenariotaskexecution - 权限: 需要授权访问
[Authorize] - 日志: 完整的操作日志记录
2. API端点
- 获取任务执行过程:
GET /api/testscenariotaskexecution- 支持场景和设备过滤,可控制是否包含执行和用例详情
设计说明: 基于现有Controller的实现模式,采用单一端点设计,通过查询参数控制不同的过滤条件和数据包含选项,这与现有的TestScenarioTasksController和TestScenariosController的设计保持一致。
3. 查询参数
- scenarioCode: 场景编码过滤
- deviceCode: 设备编码过滤
- includeExecutionDetails: 是否包含执行详情(默认true)
- includeCaseDetails: 是否包含用例详情(默认true)
4. 技术特点
- 统一响应: 使用
OperationResult<T>统一响应格式 - 错误处理: 完整的错误处理和用户友好的错误消息
- 日志记录: 详细的操作日志,包括开始、成功、失败状态
- 参数验证: 自动参数验证和类型转换
5. API使用示例
# 获取所有任务执行过程
GET /api/testscenariotaskexecution
# 获取指定场景的任务执行过程
GET /api/testscenariotaskexecution?scenarioCode=SCENARIO_001
# 获取指定设备的任务执行过程
GET /api/testscenariotaskexecution?deviceCode=DEVICE_001
# 获取任务执行过程概览(不包含执行详情)
GET /api/testscenariotaskexecution?scenarioCode=SCENARIO_001&includeExecutionDetails=false&includeCaseDetails=false
# 获取完整任务执行过程(包含执行和用例详情)
GET /api/testscenariotaskexecution?scenarioCode=SCENARIO_001&includeExecutionDetails=true&includeCaseDetails=true
# 获取任务执行过程(仅包含执行详情,不包含用例详情)
GET /api/testscenariotaskexecution?deviceCode=DEVICE_001&includeExecutionDetails=true&includeCaseDetails=false
6. 响应格式示例
{
"isSuccess": true,
"data": {
"taskTrees": [
{
"taskId": "TASK_001",
"taskCode": "TASK_001",
"taskName": "测试任务1",
"scenarioCode": "SCENARIO_001",
"deviceCode": "DEVICE_001",
"executionCount": 2,
"executions": [
{
"executionId": "EXEC_001",
"taskId": "TASK_001",
"status": "Success",
"caseCount": 3,
"caseDetails": [
{
"caseDetailId": "CASE_001",
"executionId": "EXEC_001",
"testCaseFlowId": "FLOW_001",
"status": "Success"
}
]
}
]
}
],
"totalTaskCount": 1,
"totalExecutionCount": 2,
"totalCaseCount": 3
},
"errorMessages": null
}
### 数据库表关系
tb_testscenario_task (任务表) ├── Id (主键) ├── TaskCode (任务编码) ├── TaskName (任务名称) ├── ScenarioCode (场景编码) ├── DeviceCode (设备编码) └── ... (其他字段)
tb_testscenario_task_execution_detail (执行详情表) ├── Id (主键) ├── TaskId (外键 → tb_testscenario_task.Id) ├── ScenarioCode (场景编码) ├── ExecutorId (执行人ID) ├── Status (执行状态) └── ... (其他字段)
tb_testscenario_task_execution_case_detail (用例详情表) ├── Id (主键) ├── ExecutionId (外键 → tb_testscenario_task_execution_detail.Id) ├── ScenarioCode (场景编码) ├── TestCaseFlowId (测试用例流程ID) ├── ExecutorId (执行人ID) └── ... (其他字段)
### 树形结构示例
任务1 (TestScenarioTaskTreeDto) ├── 执行1 (TaskExecutionTreeDto) │ ├── 用例1 (TaskExecutionCaseTreeDto) │ ├── 用例2 (TaskExecutionCaseTreeDto) │ └── 用例3 (TaskExecutionCaseTreeDto) ├── 执行2 (TaskExecutionTreeDto) │ ├── 用例4 (TaskExecutionCaseTreeDto) │ └── 用例5 (TaskExecutionCaseTreeDto) └── 执行3 (TaskExecutionTreeDto) └── 用例6 (TaskExecutionCaseTreeDto)
任务2 (TestScenarioTaskTreeDto) └── 执行4 (TaskExecutionTreeDto) ├── 用例7 (TaskExecutionCaseTreeDto) └── 用例8 (TaskExecutionCaseTreeDto)
### 性能优化
1. **按需加载**: 通过参数控制是否加载执行和用例详情
2. **批量查询**: 使用仓储的批量查询方法减少数据库访问次数
3. **内存优化**: 避免N+1查询问题,使用高效的关联查询
4. **缓存友好**: 设计支持后续缓存优化的数据结构
### 前端实现
#### 1. 服务层设计
- **服务类**: `TestScenarioTaskExecutionService` - 完全对应后端Controller
- **API路径**: `/testscenariotaskexecution` - 与后端路由保持一致
- **类型定义**: 与后端DTO完全对应的TypeScript接口
- **错误处理**: 统一的错误处理和用户友好的提示
#### 2. 视图组件设计
- **主组件**: `TaskExecutionProcessView` - 避免与现有组件重名
- **功能定位**: 专门用于查看任务执行结果和过程
- **布局设计**: 左右分栏布局,左侧树形结构,右侧详细信息表格
- **UI特点**:
- 左侧可折叠的树形结构展示任务层次
- 右侧表格展示选中任务的详细执行信息
- 状态图标和颜色区分不同执行状态
- 支持按场景和设备过滤
- 可控制是否显示执行和用例详情
#### 3. 组件拆分架构
- **TaskExecutionProcessView**: 主视图组件,负责数据获取和状态管理
- **TaskExecutionTree**: 左侧树形组件,展示任务列表和层次结构
- **TaskExecutionTable**: 右侧表格组件,展示选中任务的详细信息
- **组件通信**: 通过props传递数据和回调函数实现组件间通信
#### 4. 组件特性
- **响应式设计**: 适配不同屏幕尺寸,大屏显示左右布局,小屏堆叠显示
- **交互友好**: 左侧树形结构可折叠展开,右侧表格支持搜索和过滤
- **状态可视化**: 不同颜色和图标表示执行状态
- **实时更新**: 支持刷新和重新查询
- **性能优化**: 按需加载执行和用例详情
- **数据联动**: 左侧选择任务,右侧自动更新对应详细信息
- **主题适配**: 使用主题变量,支持明暗主题切换
- **布局优化**: 任务列表铺满容器,内部滚动条优化用户体验
- **Card布局**: 为Card组件添加flex布局确保子组件正确继承高度
#### 5. 步骤详情功能扩展
##### 5.1 新增功能概述
基于用户需求,在现有的TestScenarioTaskTree功能基础上,新增了通过CaseDetailId获取StepId,然后关联tb_testscenario_task_execution_step_log表的功能。
##### 5.2 数据流程
1. **输入**: CaseDetailId (用例执行明细ID)
2. **查询步骤**: 通过CaseDetailId从tb_testscenario_task_execution_case_step_detail表获取StepId列表
3. **关联日志**: 使用StepDetailId关联tb_testscenario_task_execution_step_log表获取步骤执行日志
4. **输出**: 包含步骤详情和日志的完整数据结构
##### 5.3 新增文件
**X1.Application/Features/TestScenarioTaskTree/Queries/GetTestScenarioTaskStepDetails/GetTestScenarioTaskStepDetailsResponse.cs**
- 定义了步骤详情和日志的DTO结构
- `GetTestScenarioTaskStepDetailsResponse`: 响应容器
- `TestScenarioTaskStepDetailDto`: 步骤详情DTO
- `TestScenarioTaskStepLogDto`: 步骤日志DTO
**X1.Application/Features/TestScenarioTaskTree/Queries/GetTestScenarioTaskStepDetails/GetTestScenarioTaskStepDetailsQuery.cs**
- 定义了查询参数
- 支持日志类型过滤、时间范围过滤等条件
**X1.Application/Features/TestScenarioTaskTree/Queries/GetTestScenarioTaskStepDetails/GetTestScenarioTaskStepDetailsQueryHandler.cs**
- 实现了查询逻辑
- 通过Repository获取步骤详情和日志数据
- 支持条件过滤和排序
##### 5.4 Controller扩展
**X1.Presentation/Controllers/TestScenarioTaskExecutionController.cs**
- 新增 `GetTestScenarioTaskStepDetails` 端点
- 路由: `GET /api/testscenariotaskexecution/step-details`
- 支持查询参数: caseDetailId, includeStepLogs, logTypeFilter, startTimeFilter, endTimeFilter
##### 5.5 技术特性
- **CQRS模式**: 遵循现有的Command Query Responsibility Segregation模式
- **MediatR**: 使用MediatR进行查询处理
- **Repository模式**: 利用现有的Repository接口和实现
- **日志记录**: 完整的日志记录和错误处理
- **参数验证**: 输入参数验证和错误处理
- **条件过滤**: 支持多种过滤条件
#### 6. 前端服务实现
##### 6.1 服务层扩展
**X1.WebUI/src/services/testScenarioTaskExecutionService.ts**
- 新增步骤日志类型枚举 `StepLogType`
- 新增步骤详情相关DTO接口:
- `TestScenarioTaskStepLogDto`: 步骤日志DTO
- `TestScenarioTaskStepDetailDto`: 步骤详情DTO
- `GetTestScenarioTaskStepDetailsRequest`: 请求接口
- `GetTestScenarioTaskStepDetailsResponse`: 响应接口
- 新增服务方法 `getTestScenarioTaskStepDetails()`: 获取步骤详情和日志
##### 6.2 组件层实现
**X1.WebUI/src/pages/task-execution-process/StepDetailsView.tsx**
- 步骤日志视图组件
- 直接显示所有步骤的日志,按时间排序
- 支持日志类型过滤和搜索功能
- 每个日志项包含对应的步骤信息
- 完整的错误处理和加载状态
**X1.WebUI/src/pages/task-execution-process/TaskExecutionTree.tsx**
- 修改用例执行详情组件,添加点击事件
- 支持用例点击查看步骤详情
- 传递用例点击回调函数
**X1.WebUI/src/pages/task-execution-process/TaskExecutionProcessView.tsx**
- 添加步骤详情状态管理
- 移除TaskExecutionTable组件,直接使用StepDetailsView
- 实现固定两列布局:任务树 + 步骤详情
- 添加用例点击处理逻辑
- 集成步骤详情视图
##### 6.3 交互流程
1. **用例点击**: 用户在任务树中点击用例执行详情
2. **状态更新**: 设置选中的用例明细ID,显示步骤日志视图
3. **数据获取**: 自动调用步骤详情API获取数据
4. **日志展示**: 在右侧面板展示所有步骤的日志,按时间排序
5. **关闭功能**: 用户可点击关闭按钮清空选择
##### 6.4 技术特性
- **响应式布局**: 支持不同屏幕尺寸的布局适配
- **状态管理**: 完整的组件状态管理
- **错误处理**: 统一的错误处理和用户提示
- **加载状态**: 友好的加载状态显示
- **搜索过滤**: 支持步骤搜索和日志类型过滤
- **主题适配**: 使用主题变量,支持明暗主题
#### 7. 技术实现
- **React Hooks**: 使用useState和useEffect管理状态
- **TypeScript**: 强类型定义确保数据安全
- **Tailwind CSS**: 现代化的样式设计,支持响应式布局
- **Lucide Icons**: 统一的图标系统
- **Toast通知**: 用户友好的操作反馈
- **组件化设计**: 模块化的组件结构,便于维护和扩展
- **状态管理**: 集中式状态管理,通过props传递数据
#### 6. 导航菜单配置
- **菜单位置**: 任务管理 → 查看任务
- **菜单路径**: `/dashboard/tasks/execution-process`
- **权限代码**: `testscenariotaskexecution.view`
- **图标**: `ClipboardList` - 表示查看和列表
- **排序**: 6 - 在任务管理子菜单中排在最后
- **描述**: 查看任务执行过程和结果
#### 7. 路由配置
- **路由路径**: `/dashboard/tasks/execution-process`
- **组件**: `TaskExecutionProcessView`
- **权限控制**: `testscenariotaskexecution.view`
- **懒加载**: 使用React.lazy进行代码分割
- **动画容器**: 使用AnimatedContainer包装
- **保护路由**: 使用ProtectedRoute进行权限验证
### 最新更新 (2025-01-21)
#### 任务列表显示优化
- **文件**: `X1.WebUI/src/pages/task-execution-process/TaskExecutionTree.tsx`
- **变更**: 移除不必要的字段显示,优化任务列表显示为更紧凑的格式
- **具体修改**:
- 移除用例流程 (`testCaseFlowId`) 显示
- 移除场景 (`scenarioCode`) 显示
- 移除执行人 (`executorId`) 显示
- 移除执行ID (`executionId`) 显示
- 优化间距和内边距,使显示更紧凑
- 减少组件间距:`space-y-2` → `space-y-1`
- 减少内边距:`p-3` → `p-2`,`p-4` → `p-2`
- 移除未使用的 `User` 图标导入
#### 步骤日志显示优化
- **文件**: `X1.WebUI/src/pages/task-execution-process/StepDetailsView.tsx`
- **变更**: 移除步骤日志信息中的执行人和ID显示,优化显示内容
- **具体修改**:
- 移除 `log.logId` 的显示
- 移除 `stepDetail.executorId` 的显示
- 简化步骤信息显示,只保留步骤名称、状态和耗时
- 优化布局,减少不必要的空白空间
- 为日志内容添加滚动条:`max-h-32 overflow-y-auto`
- 进一步紧凑化显示:减少间距和内边距
### 扩展性
1. **层级扩展**: 可以轻松添加更多层级(如步骤详情)
2. **过滤扩展**: 可以添加更多过滤条件(如时间范围、状态等)
3. **排序扩展**: 可以添加排序功能(如按时间、状态等)
4. **分页扩展**: 可以添加分页功能以处理大量数据
5. **实时更新**: 可以添加WebSocket支持实时状态更新
6. **导出功能**: 可以添加数据导出功能