# 执行计划 - 性能测试项目管理与批量执行

> **关联 PRD**：`_PRD_性能测试项目管理与批量执行.md`
> **创建日期**：2026-08-20
> **预计总工时**：3.5 天

---

## 一、执行概述

本计划将 PRD 中的「性能测试项目管理与批量执行」功能分为 4 个 Phase 实施：

1. **Phase 1**：数据模型 + 后端 CRUD API（1 天）
2. **Phase 2**：项目列表页 + 项目详情页 UI（1 天）
3. **Phase 3**：批量执行 + 进度推送（1 天）
4. **Phase 4**：现有任务列表适配 + 联调测试（0.5 天）

每个 Phase 完成后可独立验收，Phase 1 是后续所有 Phase 的基础。

---

## 二、任务分解

### Phase 1：数据模型 + 后端 CRUD API

**目标**：新建 PerformanceProject 模型，扩展 PerformanceTask 加 project_id 字段，实现项目 CRUD API。

| # | 任务 | 关键文件 | 验收标准 |
|---|------|---------|---------|
| 1.1 | 新建 `PerformanceProject` ORM 模型 | `backend/app/models/performance.py` | 表字段与 PRD 3.1 一致（id/name/description/project_type/icon/sort_order/created_at/updated_at） |
| 1.2 | 扩展 `PerformanceTask` 模型增加 `project_id` 字段 | `backend/app/models/performance.py` | project_id VARCHAR(64) DEFAULT NULL，to_dict() 输出含 project_id |
| 1.3 | 数据库迁移脚本（SQLite ALTER TABLE） | `backend/scripts/migrate_add_perf_project.py` | 运行后 performance_projects 表存在，performance_tasks 有 project_id 列 |
| 1.4 | 新建 Project CRUD schemas | `backend/app/schemas/performance.py` | PerformanceProjectCreate/Update/Response，camelCase alias |
| 1.5 | 新建 Project CRUD 路由 + Service | `backend/app/routers/performance.py`, `backend/app/services/performance_service.py` | GET/POST/PUT/DELETE /api/performance/projects 全部可用 |
| 1.6 | 项目统计接口 | 同上 | GET /api/performance/projects/{id}/stats 返回任务数、状态分布 |
| 1.7 | list_tasks 增加 project_id 筛选参数 | `backend/app/routers/performance.py`, `backend/app/services/performance_service.py` | 传 project_id 筛选、传 null 查未归属任务、不传返回全部（向后兼容） |
| 1.8 | 创建/更新任务 schema 增加 project_id 字段 | `backend/app/schemas/performance.py` | PerformanceTaskCreate/Update 含可选 project_id |

**验收方式**：通过 http://localhost:8001/docs 的 Swagger UI 手动测试所有项目 CRUD 接口。

---

### Phase 2：项目列表页 + 项目详情页 UI

**目标**：新建两个前端页面，实现项目卡片网格和项目内任务列表。

| # | 任务 | 关键文件 | 验收标准 |
|---|------|---------|---------|
| 2.1 | 新增 PerformanceProject 类型定义 | `frontend/src/types/performance.ts` | 接口与后端 schema 对应 |
| 2.2 | 新增项目 API 调用函数 | `frontend/src/api/performance.ts` | projects CRUD + stats + listTasks(projectId) |
| 2.3 | 新建项目列表页 `Projects.vue` | `frontend/src/views/performance/Projects.vue` | 卡片网格布局，顶部 tab（标准版/项目定制），每行 4 张卡片，含编辑/删除操作 |
| 2.4 | 新建项目详情页 `ProjectDetail.vue` | `frontend/src/views/performance/ProjectDetail.vue` | 顶部项目信息，工具栏（执行全部/新建任务），任务表格（含 checkbox 列） |
| 2.5 | 注册路由 | `frontend/src/router/index.ts` | /performance/projects 和 /performance/projects/:id 可访问 |
| 2.6 | 侧边栏菜单更新 | `frontend/src/App.vue` 或菜单配置 | 性能测试下出现「项目管理」子菜单入口 |

**验收方式**：浏览器访问 /performance/projects，能看到卡片网格；点击卡片进入详情页，能看到任务列表。

---

### Phase 3：批量执行 + 进度推送

**目标**：实现整项目执行和多任务批量执行，通过 WebSocket 推送进度。

| # | 任务 | 关键文件 | 验收标准 |
|---|------|---------|---------|
| 3.1 | 新建批量执行记录模型（可选 P1） | `backend/app/models/performance.py` | performance_batch_executions 表创建 |
| 3.2 | 实现 run-all API（项目下所有任务串行执行） | `backend/app/routers/performance.py`, `backend/app/services/performance_service.py` | POST /api/performance/projects/{id}/run-all 返回 batch_id |
| 3.3 | 实现 batch-run API（指定任务列表串行执行） | 同上 | POST /api/performance/tasks/batch-run 接收 task_ids 数组 |
| 3.4 | WebSocket 批量进度消息 | `backend/app/websocket/manager.py` | 消息类型 perf_batch_progress，含 batch_id/current_index/total_count 等 |
| 3.5 | 前端「执行全部」按钮逻辑 | `ProjectDetail.vue` | 点击后调用 run-all，监听 WebSocket 显示进度条 |
| 3.6 | 前端「批量执行」按钮逻辑 | `ProjectDetail.vue` | 勾选任务后出现批量执行按钮，点击调用 batch-run，显示进度条 |
| 3.7 | 批量执行进度 UI 组件 | `ProjectDetail.vue` | 进度条显示「当前第 N 个 / 共 M 个」，成功/失败计数 |

**验收方式**：在项目详情页勾选多个任务，点击批量执行，观察进度条实时更新；点击「执行全部」同理。

---

### Phase 4：现有列表适配 + 联调测试

**目标**：全局任务列表增加项目列和筛选，整体联调。

| # | 任务 | 关键文件 | 验收标准 |
|---|------|---------|---------|
| 4.1 | 全局任务列表增加「归属项目」列 | `frontend/src/views/performance/TaskList.vue` | 表格显示项目名称（el-tag） |
| 4.2 | 全局任务列表增加项目筛选下拉 | `frontend/src/views/performance/TaskList.vue` | 下拉选择项目可筛选，选「全部」返回所有 |
| 4.3 | 创建/编辑任务弹窗增加项目选择 | `frontend/src/views/performance/TaskList.vue` 或组件 | 弹窗中有「归属项目」下拉选择器 |
| 4.4 | 整体联调 | 全部相关文件 | 创建项目 → 创建任务归入项目 → 项目详情页查看 → 批量执行 → 全局列表筛选均正常 |
| 4.5 | 数据迁移验证 | `backend/scripts/migrate_add_perf_project.py` | 已有数据不受影响，project_id 为 NULL |

**验收方式**：端到端流程——创建项目、创建任务关联项目、在项目详情页批量执行、在全局列表按项目筛选。

---

## 三、验收标准总览

| 验收项 | 对应 Phase |
|--------|-----------|
| 项目 CRUD API 全部可用 | Phase 1 |
| list_tasks 支持 project_id 筛选且向后兼容 | Phase 1 |
| 项目列表页卡片网格正常展示 | Phase 2 |
| 项目详情页任务列表正常展示 | Phase 2 |
| 整项目执行（run-all）串行执行完成 | Phase 3 |
| 多任务批量执行（batch-run）串行执行完成 | Phase 3 |
| WebSocket 实时推送批量进度 | Phase 3 |
| 全局任务列表显示项目列 + 支持筛选 | Phase 4 |
| 创建/编辑任务可选择归属项目 | Phase 4 |
| 已有数据不被破坏 | Phase 1, 4 |

---

## 四、测试计划

### 单元测试
- Phase 1 完成后：Project CRUD Service 测试
- Phase 3 完成后：批量执行逻辑测试

### 集成测试
- Phase 4 完成后：端到端流程测试
  - 创建项目 → 创建任务 → 关联项目 → 批量执行 → 查看结果

### 手动测试
- 各 Phase 完成后通过 Swagger UI + 前端页面手动验证

---

## 五、风险评估

| 风险 | 影响 | 缓解措施 |
|------|------|---------|
| 批量执行串行耗时长 | 用户等待时间长 | WebSocket 实时推送进度，支持中途取消（可选） |
| 多任务执行资源竞争 | 压测引擎互相干扰 | 严格串行，一个完成才执行下一个 |
| 数据库锁（SQLite） | 并发写入失败 | 利用现有 pool_pre_ping + check_same_thread 配置 |
| 现有 API 兼容性 | 前端调用异常 | project_id 为 nullable，不传时返回全部（向后兼容） |

---

## 六、后续工作

- [ ] Phase 1-4 实施完成后更新 CLAUDE.md 当前进度
- [ ] 更新 HANDOFF.md 交接文档
- [ ] Git 提交（Conventional Commits）
- [ ] 部署到 5.60 服务器（如需要）

---

## 七、附录

### 关键数据流

```
创建项目 → POST /api/performance/projects
    ↓
创建任务（带 project_id）→ POST /api/performance/tasks
    ↓
项目详情页 → GET /api/performance/projects/{id} + list_tasks(project_id)
    ↓
批量执行 → POST /api/performance/tasks/batch-run
    ↓
WebSocket 进度推送 ← perf_batch_progress
```

### 参考文件

| 文件 | 用途 |
|------|------|
| `frontend/src/views/modules/Modules.vue` | 卡片网格布局参考 |
| `frontend/src/api/modules.ts` | API 调用模式参考 |
| `backend/app/services/module_service.py` | Service 层 CRUD 参考 |
| `backend/app/models/module.py` | Module 模型参考（module_type） |
| `backend/app/services/performance_service.py` | 现有性能服务（_run_sync 串行执行逻辑） |

---

*本文档由 prd-plan skill 生成，关联 PRD：`_PRD_性能测试项目管理与批量执行.md`*
