# HANDOFF_性能测试

> 生成时间：2026-08-12 15:00
> 最后更新：2026-08-24 10:00
> 当前分支：`platform-auto-test`
> 最近提交：`21d65661 docs(device-sim): 更新 HANDOFF 记录设备模拟模块部署到 5.60`
> 主分支：`master`

---

## 整体状态

| 阶段 | 状态 | 说明 |
|------|------|------|
| Phase 1-4（基础框架） | ✅ 完成 | ORM + Schema + 执行引擎 + 路由/Service + 前端三面板 |
| Phase 5（集成测试/响应捕获/跨任务引用） | ✅ 完成核心 | 会议预约 API 端到端验证通过（2026-08-17） |
| 读取系统配置被测系统 URL | ✅ 已部署 | 运行时读取，不再依赖任务 target_url（2026-08-19） |
| 任务级自定义登录凭据 | ✅ 已部署 | 新建/编辑任务可填自定义用户名/密码（2026-08-19） |
| 从 curl 自动生成压测任务 | ✅ 已部署 | 新建弹窗「从 curl 导入」→ 解析回填表单（2026-08-19） |
| 项目管理（项目卡片 + 批量执行） | ✅ 已部署 | 前端 Projects/ProjectDetail/TaskList 适配（2026-08-20） |
| 指标体系增强（10项新指标） | ✅ 已部署 | P95/标准差/Apdex/延迟/连接时间/字节数/峰值TPS/错误分类（2026-08-20） |
| 批量执行合并报告 | ✅ 已部署 | 项目批量/一键执行生成一份合并报告（聚合指标 + 各任务明细）（2026-08-20） |
| 批量执行跳转监控页 + 3 个 P0 修复 | ✅ 已部署 | BatchMonitor.vue + 500/残留completed/status_2xx 修复（2026-08-21） |
| body 字符串存储导致 4XX 修复 | ✅ 已部署 | 前端 JSON.parse + 后端防御性 json.loads + 数据库脏数据清洗（2026-08-21） |
| 事务处理时间（Transaction） | ✅ 已部署 | 多步骤串行事务 + 步骤级耗时统计 + 瀑布图/步骤明细表（2026-08-21） |
| 目标机资源监控（SSH）+ Java 进程监控 | ✅ 已部署 | SSH 采集 CPU/内存/负载 + Java 进程级监控 + 实时监控/报告展示（2026-08-22） |
| **两种压测场景增强（burst/endurance）+ 报告页场景标签/多接口明细表** | **✅ 已部署，5.60 e2e 验证通过** | 瞬时并发（集合点同步/循环模式/错误策略）+ 8 小时长稳压测（多接口线程组/思考时间分布/CSV 参数化）（2026-08-22） |

---

## 🆕 当前会话（2026-08-24 — WebSocket 批量进度订阅端点 + TaskList 中文回归）

**任务来源**：P1 遗留「WebSocket 批量进度订阅端点」→ 项目详情页批量执行实时进度条闭环。

### 已完成（本地，待 commit/部署）

| 功能 | 状态 | 说明 |
|------|------|------|
| 后端 `/ws/batch/{batch_id}` 端点 | ✅ 本地完成 | 订阅 `perf_batch_{batch_id}` 组；连接时从 DB 推送当前批次状态快照；ping/pong 保活 |
| 批量进度广播重构 | ✅ 本地完成 | `_broadcast_progress()` 同时推送全局 `perf_batch` + 批次专属 `perf_batch_{batch_id}` 两组 |
| 前端 `createPerfBatchStream()` | ✅ 本地完成 | api/performance.ts 新增批次专属 WS 连接封装 |
| ProjectDetail.vue 进度条闭环 | ✅ 本地完成 | 批量/全部执行后连接批次 WS，实时刷新进度/成功失败数，完成自动刷任务列表，关闭按钮断开 |
| `PerfBatchProgress.currentStatus` 类型修复 | ✅ 本地完成 | 补 `partially_failed` / `cancelled` 联合类型，修复 TS2367 编译错误 |
| TaskList.vue 文案中文回归 | ✅ 本地完成 | 全部标签从「英文+中文备注」改回纯中文；仅保留性能指标列英文+中文（TPS（吞吐量）/ Error Rate（错误率）） |

### 部署 5.60

**已部署（2026-08-22）**：burst/endurance 场景增强 + 报告页场景标签/接口明细表 + Transaction + 目标机监控 + Java 进程监控。
**本次会话改动尚未部署 5.60**（WS 批量进度端点 + TaskList 中文回归），待下次部署。

---

## 最新会话进度（2026-08-22 — 部署到 5.60 + e2e 验证 ✅）

> **部署包**：后端 9 文件 + 前端 dist（93 文件）→ 5.60 服务器
> **修复**：api_summary dict→List[Dict] 格式不匹配 → endurance 报告页正常显示 apiSummary 明细表
> **e2e 验证**：burst/endurance 场景标签 + apiSummary 表格 + 旧任务无回归 + 全部 API 端点 200 ✅

### 已部署功能清单（5.60 全部上线）

| 功能 | 状态 | 说明 |
|------|------|------|
| Transaction 事务处理 | ✅ 已部署 | 多步骤串行事务 + 步骤级耗时统计 + 瀑布图/步骤明细表 |
| Burst 场景增强 | ✅ 已部署 | 集合点同步 + 循环模式(finite/infinite) + 错误策略(continue/stop) |
| Endurance 场景增强 | ✅ 已部署 | 多接口独立线程组 + 思考时间分布 + CSV 参数化 |
| 报告页场景标签 | ✅ 已验证 | burst 橙色 / endurance 红色 / legacy 灰色 |
| 报告页多接口明细表 | ✅ 已验证 | apiSummary 表格：接口名/请求数/成功/失败/错误率/TPS/响应时间分位/标准差 |

**phase 1 后端模型+Schema+迁移**：`PerformanceTask` 新增 `scenario_type`（null/burst/endurance）+ 配套字段（loop_type/loop_count/synchronizing_timer_count/synchronizing_timer_timeout/error_action/scenario_apis/think_time_min/think_time_max/think_time_distribution/csv_content）。Pydantic camelCase 别名 + `populate_by_name`。

**phase 2 执行引擎**：burst 模式用 `_BurstBarrier` 集合点同步（所有 worker 同时放行），loop_type finite/infinite，error_action continue/stop；endurance 模式多接口独立线程组 + think_time constant/gaussian 分布 + CSV 参数化 `{{csv.field}}`。

**phase 3 前端场景化表单（TaskList.vue）**：场景类型 select + burst 配置区（循环类型/次数/集合点同步/错误策略）+ endurance 多接口编辑器（增删/上下移/思考时间/CSV 粘贴框）。

**phase 4 报告页场景标签+多接口明细表（ReportPanel.vue）**：场景标签（burst 橙色/endurance 红色/标准灰色）+ 接口级统计明细表（apiSummary 列：接口名/请求数/成功/失败/错误率/TPS/响应时间分位/标准差）。**后端修复**：schemas/performance.py `api_summary` 类型 `Dict`→`List[Dict]`；routers/performance.py `get_report()` 补透传 `api_summary`。

**数据链路**：executor `_metrics._build_api_summary()` → service `task.api_summary` → report dict → router → `PerformanceReportResponse.api_summary(List)` → 前端表格。

**验证**：schema 冒烟 3 种 payload ✅ / `PerformanceReportResponse` 构造 ✅ / pytest 25 passed ✅ / npm build ~26s ✅

**✅ 已部署 5.60（2026-08-22 16:00）**：后端 9 文件（models/schemas/database/executors/routers/services + 目标机 monitor）+ `_ensure_columns` 自动迁移 + performance_tasks 手动补 `csv_content`/`csv_variable_mapping` 两列（MySQL TEXT 不支持 DEFAULT）→ 前端 dist 全量覆盖 → 容器重启 healthy。

**e2e 验证全通过**：
- burst 任务（perf_97fe...）：执行 completed，15 req / 2.88 tps / 0% 错误率 → 报告页橙色标签「瞬时并发 Burst」✅
- endurance 任务（perf_3b50...）：执行 completed，107 req / 1.83 tps / 2 接口 → 报告页红色标签「长稳压测 Endurance」+ apiSummary 明细表 2 行（会议列表 60 req / 模板列表 47 req）✅
- legacy 旧任务：灰色标签「标准 Standard」，apiSummary 为空不显示表格（无回归）✅
- **api_summary 格式修复**：执行器 `_build_api_summary()` 由 dict 改为 `List[Dict]`（camelCase 匹配前端 `ApiSummaryData` 接口），`PerformanceTaskResponse.api_summary` 同步 `Dict`→`List[Dict]`，修复 endurance 报告 API 500
- 冒烟测试全部 API 端点 200 ✅

---

## 🆕 上一会话（2026-08-22 — 修复目标机实时监控图表空白 + Java 进程监控全量上线）

**问题**：目标机 ECharts 图表在实时监控中空白。**根因**：`v-show=false`（`display:none`）时 `echarts.init()` 得到 0×0 画布。**修复**：移除 init 调用改为纯懒初始化 + `resize()` 兜底 + `nextTick` 包裹。

**Java 进程监控（前后端全链路）**：SSH `ps -eo` 采集 `ubains-meeting-*` 进程 → 执行器集成 → 类型扩展 → 实时监控 Java 进程表格 → 报告页进程统计表 + CPU 趋势图。

**部署 5.60（2026-08-22 11:30）**：npm build ✅ → dist 全量覆盖 → docker restart → healthy ✅

---

## 历史会话概要（2026-08-17 ~ 2026-08-21）

| 时间 | 工作内容 | 部署状态 |
|------|---------|---------|
| 08-17 | 会议预约 API 端到端验证 + A0027 修复（stale pyc 坑） | ✅ 已部署 |
| 08-19 | 读取系统配置 URL + 自定义登录凭据 + curl 导入 + 修复 curl [object Object] + 修复保存 422 | ✅ 已部署 |
| 08-20 | 项目管理与批量执行 + 合并报告 + 指标体系增强（10 项新指标，25 单测） | ✅ 已部署 |
| 08-21 | 资源图表宽度修复 + 目标机监控 PRD + Transaction 前后端（瀑布图/步骤明细表） | ✅ 已部署（08-22） |
| 08-21 | 批量执行跳转监控页（BatchMonitor）+ 3 个 P0 修复（500/残留completed/status_2xx）+ body 4XX 修复 | ✅ 已部署 |

---

## 当前运行状态

### 生产服务器 192.168.5.60
- 容器 `plat-auto-test-app`：healthy，内部端口 80
- **已部署**：curl 导入 + 自定义凭据 + 读取系统配置 URL + 项目管理与批量执行 + 合并报告 + 指标体系增强 + BatchMonitor + 3 个 P0 修复 + body 4XX 修复 + 目标机监控 + Java 进程监控 + Transaction 事务处理 + burst/endurance 场景增强 + 报告页场景标签/多接口明细表
- **未部署**：无（所有功能已部署）

### 本地（Windows 开发机）
- 后端 8001 / 前端 3000 | 数据库 `data/test_platform.db`
- **最新改动**：WebSocket 批量进度订阅端点（后端 2 文件）+ ProjectDetail 实时进度条 + TaskList 中文回归（前端 4 文件，本地 build 通过，未部署）

---

## 未提交的代码

```
# 后端（8 文件已修改）
backend/app/config.py                                 # 目标机监控配置项
backend/app/database.py                               # 字段迁移累积
backend/app/executors/performance_executor.py          # burst/endurance + Transaction + 目标机监控 + 指标体系增强
backend/app/executors/target_resource_monitor.py       # NEW: SSH 采集
backend/app/models/performance.py                      # 场景字段 + Transaction 字段 + status_2xx~5xx
backend/app/routers/performance.py                     # 项目路由 + 合并报告 + 批量 + api_summary 透传
backend/app/schemas/performance.py                     # 全部新 schema + api_summary 类型修复
backend/app/services/performance_service.py            # 批量/合并/项目/场景/自定义凭据

# 前端（8 文件已修改）
frontend/src/views/performance/TaskList.vue             # 场景表单 + Transaction 步骤编辑器 + curl 导入 + 项目选择
frontend/src/views/performance/ReportPanel.vue           # 场景标签 + apiSummary 表 + 指标卡片 + 瀑布图
frontend/src/views/performance/MonitorPanel.vue          # 目标机/Java 监控 + 新增图表
frontend/src/views/performance/BatchMonitor.vue          # NEW: 批量执行监控页
frontend/src/views/performance/ProjectDetail.vue         # 批量执行/合并报告入口
frontend/src/views/performance/Projects.vue              # 项目管理
frontend/src/views/performance/ProjectReport.vue         # NEW: 合并报告页
frontend/src/types/performance.ts                        # 全部新类型

# 路由/API
frontend/src/router/index.ts                             # 新增路由
frontend/src/api/performance.ts                          # 新增 API 封装

# 文档（新增）
Docs/PRD/性能测试/需求文档/                                # 各功能 PRD + 计划执行文档
Docs/PRD/性能测试/问题处理/                                # 各问题处理 + 执行计划文档
```

---

## 下一步任务

### P1 — 待办
- ✅ WebSocket 批量进度订阅端点 **已完成（2026-08-24 本地）**，待部署 5.60

### P1 — 按请求序号错开时间段（并发预约类接口关键）
`template_resolver.py` 增加 `INDEX` 后缀支持，如 `{__NOW_+37_H_INDEX__}`

### P2 — 后续优化
断言规则验证（建议加 `$.success == true`）、Token 过期重试、报告对比、PDF 导出、数据清理

---

## 关键踩坑记录

| 现象 | 根因 | 正确做法 |
|------|------|---------|
| 目标机监控图表空白 | `v-show=false` 时 `echarts.init()` 得 0×0 画布 | 懒初始化 + `resize()` 兜底 + `nextTick` |
| 批量详情 API 500 | `task.actual_concurrency` 不存在（ORM 只有 `concurrency`） | 访问 ORM 属性前核对 models/*.py 字段定义 |
| 合并报告一直「暂无」 | `PerformanceTask` 缺 `status_2xx~5xx` 字段，聚合时 AttributeError 被静默吞掉 | 模型补字段 + `_apply_result()` 补写入 |
| body 存储导致 4XX | 前端缺 `JSON.parse()` 导致字符串存入 MySQL JSON 列 → aiohttp 双重序列化 | 三端 JSON 字段一致性，前端提交必须 parse |
| A0027 时间格式不正确 | 服务器 `template_resolver.py` 旧版 + stale `__pycache__` | 删 pyc + 重启容器（源码改了但字节码旧） |
| curl 导入 `[object Object]` | `CurlParseRequest` 缺 `model_config` camelCase 映射 + Windows `^` 续行符未处理 | 补 `populate_by_name` + `_preprocess_cmd_style()` |
| 保存任务 422 | 非 Optional 字段接收 null → Pydantic v2 拒绝 | 改 `Optional` + `default=None` |
| 部署后文件未生效 | scp 后文件 mtime 未变（实际未覆盖） | 部署后 `grep`/`mtime` 验证关键代码行 |

---

*本文档由 Claude Code 自动生成，用于多会话协作开发时的上下文传递。*