提交 7e8d7d20 authored 作者: 陈泽健's avatar 陈泽健

docs(ui-automation): 记录会话43 R7 执行器修复三台部署

HANDOFF_UI自动化.md 更新:会话43 薄弱模块 R7 执行器修复(commit a63d090c)
按安全流程部署 5.44/5.202/5.60,三台容器内 SHA 一致、健康检查通过;
会话时间线新增 43;待办勾选 R7 三台部署完成并新增 P1/P2 待部署。
Co-Authored-By: 's avatarClaude <noreply@anthropic.com>
上级 c73ffd58
# HANDOFF — UI自动化测试交接文档
> **生成时间**: 2026-08-26
> **生成时间**: 2026-08-27
> **当前分支**: `platform-auto-test`
> **最近提交**: `f4892d6c` docs(handoff): 精简 HANDOFF_UI自动化文档 + 更新会话37状态
> **状态**: 🟢 **会话41:预定数据(数据统计页 StatisticsModule)用例覆盖盲区补齐——生成 6 个 navigate 直达用例(页面访问/图表数量/筛选切换/时间筛选/满意度评价/通知统计),R1 一次执行 6/6 100% 通过;沉淀 `generate_yuding_cases.py`;确认「预定数据」首页入口即数据统计页,独立「预定2.0(meetingV2)」无首页直达入口。**
> **最近提交**: `c73ffd58` feat(perf): AI 分析报告资源使用分析四维度增强(Java 进程 + MySQL)
> **状态**: 🟢 **会话43:薄弱模块 R7 执行器修复正式部署三台——`playwright_executor.py`(commit `a63d090c`,R7 版)按安全流程(备份→上传→SHA-256→原子替换→docker restart→健康检查→容器内 AST/SHA 比对)部署到 5.44/5.202/5.60,三台全部验证通过。至此「执行器代码修复未部署」遗留闭环,远端薄弱模块 NO-BODY 问题解除。**
---
## 📊 当前状态(会话 41,2026-08-26)
## 📊 当前状态(会话 43,2026-08-27)
**薄弱模块 R7 执行器修复部署三台完成**:会话 39 产出的 `playwright_executor.py` 两处修复(`_navigate_to_target_page` 改走 `_do_navigate` + `_ensure_micro_app_loaded` 阶段4 reload 兜底)此前只做了本地验证,本次正式部署到三台生产服务器。
### ✅ 部署内容(会话 43,2026-08-27)
| 项目 | 值 |
|------|-----|
| 制品 | `git show a63d090c:backend/app/executors/playwright_executor.py`**R7 提交版**,SHA-256 `8bed2b78...`,不含工作树 P1/P2 增强) |
| 部署脚本 | `backend/scripts/deploy_executor_r7.py`(本次新增 `--artifact` 参数,可指定部署本地任意执行器文件) |
| 安全流程 | 每台串行:备份 `.bak-<时间戳>` → 上传 `.tmp` → 远端 SHA-256 一致 → 原子 mv → 恢复 owner/mode → 重算正式文件 SHA → 仅成功才 `docker restart` → 健康检查 + 容器内 AST + 容器内 SHA 比对 |
| 部署结果 | 三台 **6/6 步骤全通过**(备份/上传哈希/原子替换/正式哈希/重启/容器内验证) |
| 服务器 | 部署前远端 SHA | 部署后容器内 SHA | 健康检查 | 结果 |
|--------|---------------|-----------------|---------|------|
| 5.44 | `1a88c7b1...` | `8bed2b78...` ✅ | /health 200 | ✅ |
| 5.202 | `1a88c7b1...` | `8bed2b78...` ✅ | /health 200 | ✅ |
| 5.60 | `1a88c7b1...` | `8bed2b78...` ✅ | /health 200 | ✅ |
**过程说明**
- 部署前 pre-flight:5.44/5.202 各有 1 条运行中执行、5.60 无(用户确认直接部署,重启中断的运行任务由会话 42 的 `recover_interrupted_executions()` 启动恢复机制处理✅)
- 中断的 2 条执行已被本轮容器重启接入的启动恢复标记 failed,不会残留僵尸
- 本次**仅部署执行器**,P1/P2(`smart_locate_service.py`/`smart_locate.py`/`smart_locate.py`/前端 dist)仍为本地工作树状态,后续择机部署
**数据同步回顾**:用例数据已在会话 40 同步到位(14 个断言对齐已上三台),本次执行器代码补齐后,**远端薄弱模块(信息窗管理/告警工单/文件列表/下载列表/会务统筹/会务工单/消息通知/工单列表/我的工单/通讯录)的 R7 全量修复在三台服务器已完整生效**
---
## 📊 会话历史(会话 42,2026-08-27)
**定时任务重叠 + 僵尸执行修复并部署三台**:用户在 5.44/5.202 发现「设置了定时任务执行 UI 自动化,但一个报告都没输出」,主要因上一个定时任务还没执行完、下一个就开始执行。定位到根因并完成修复。
### ✅ 问题根因(会话 42,2026-08-27)
| 根因 | 说明 |
|------|------|
| **报告只在执行正常返回时生成** | `scheduler_service.py` `if task.auto_report and run_ok`(约 line 322)。执行要跑 332 个用例,大量用例因选择器超时卡住(`.el-drawer >> text='运维巡检'` Timeout 5000ms、`.el-table, .el-card` 等 30000ms,单用例 200~386s),一轮执行远超触发间隔 → 一直跑不完 → 报告一直不生成 |
| **重叠守卫只靠内存锁,进程重启即失效** | `run_task_once``is_execution_running()`(内存 `_running_execution_id`)判断跳过。容器 `docker restart` 后内存锁清空,但 DB 里上一轮执行仍停在 `running` → 定时任务照常触发新执行、新开浏览器,与旧进程残留 Playwright 线程并发互相抢占 → 进一步拖垮执行、彻底产不出报告 |
| **僵尸记录不断累积** | 5.44 **18 条**、5.202 **14 条**、5.60 **68 条** `running` 僵尸(2026-08-19~08-27,`end_time` 全空);日志每 30s 刷「任务正在执行中,忽略重复触发」——内存级任务去重在跑,但拦不住跨重启堆积 |
### ✅ 修复内容(会话 42,2026-08-27)
| 文件 | 改动 |
|------|------|
| `backend/app/services/execution_service.py` | **新增 `recover_interrupted_executions()`**:扫描 DB,把 `start_time` 超过 300s 仍处于 `running/pending` 的 UI 执行标记为 `failed`,并同步关联的 `pending/running` 用例结果为 `failed`(security 不处理) |
| `backend/app/services/scheduler_service.py` | **DB 级重叠兜底守卫**`run_task_once` 在内存锁预检外新增 DB 查询——只要 DB 中还有 UI 执行处于 `running/pending`,即使内存锁为空也跳过本次触发并推进 `next_run_at` |
| `backend/app/main.py` | lifespan 启动时调用 `recover_interrupted_executions()`,打印清理日志 |
| `backend/tests/test_scheduler_recovery.py` | 新增 5 项测试(僵尸标记/年轻记录不误伤/空库/DB 有 running 跳过/DB 无 running 正常触发) |
### ✅ 部署结果(会话 42,2026-08-27)
三台服务器按安全流程(备份→上传→SHA-256→原子替换→docker restart→健康检查→容器内 AST/SHA 比对)部署 `execution_service.py` + `scheduler_service.py` + `main.py`,全通过。
| 服务器 | 启动恢复日志 |
|--------|-------------|
| 5.44 | 清理 **18** 条僵尸执行、2606 条用例结果 |
| 5.202 | 清理 **14** 条僵尸执行、1814 条用例结果 |
| 5.60 | 清理 **68** 条僵尸执行、401 条用例结果 |
**验证**:5.44 复核——旧的 18 条 `running` 全部转 `failed`,重启后定时任务正常触发一次新执行,DB 仅剩 1 条 running,不再堆积。全量后端测试 **324 passed**
**遗留提醒**:报告生成的前提是执行能跑完一轮。僵尸/重叠已解决,但日志里的选择器超时(`.el-drawer`/`.el-table` 等)本身未修——正是 P1/P2 智能定位要解决的事。若这些用例继续大面积超时,执行虽能完成并产出报告,但报告会大量 failed。
---
## 📊 会话历史时间线(会话 41,2026-08-26)
**预定数据模块用例覆盖盲区补齐**:应 `/sut-explore` 盘点需求,发现「预定数据」入口(首页功能卡片)在用例库中分散且步骤过旧(click 菜单导航,headless 下不稳定)。通过 `menu_block_urls_v3.json` 确认**首页「预定数据」入口实际指向 `StatisticsModule`(数据统计页)**,非独立的「预定2.0」系统;独立「预定2.0(meetingV2)」子模块(会议室列表/已预定会议/历史记录/会议审批/参会人模板)在首页功能卡片中**无独立直达入口**(仅 `elements_mapping``[data-id]` 映射,无直达 URL 配置)。
......@@ -322,6 +387,8 @@ button:has-text('确定')
| 会话 | 日期 | 主题 | 结果 |
|------|------|------|------|
| 43 | 08-27 | **薄弱模块 R7 执行器修复部署三台**`playwright_executor.py`(commit `a63d090c`)按安全流程部署 5.44/5.202/5.60,三台容器内 SHA 一致、健康检查通过;`deploy_executor_r7.py` 新增 `--artifact` 参数;会话 40 用例数据 + 本次代码修复完整生效,远端薄弱模块 NO-BODY 解除 | ✅ 三台 6/6 验证全通过 |
| 42 | 08-27 | **定时任务僵尸执行 + 重叠守卫修复并部署三台**:新增 `recover_interrupted_executions()` 启动恢复 + DB 级重叠兜底守卫 + lifespan 调用;清理三台 running 僵尸记录(5.44=18/5.202=14/5.60=68 条) | ✅ 全量测试 324 passed、三台部署验证通过 |
| 41 | 08-26 | **预定数据用例覆盖盲区补齐**:生成 6 个 navigate 直达用例(页面访问/图表数量/筛选切换/时间筛选/满意度/通知统计)至 `module_parent_yuding20`;沉淀 `generate_yuding_cases.py`(幂等);确认预定数据入口=数据统计页。**已同步三台**(5.44/5.202 393→399、5.60 394→400) | ✅ 本地 6/6 R1 一次通过;三端已同步 |
| 40 | 08-25 | **新增用例数据同步三台测试管理平台**:本地 315 条 UPSERT 至 5.44/5.202/5.60 MySQL(各补 22/22/1 条,含会话37/38/39 新增 + 14 条断言对齐更新);沉淀 `sync_cases_to_servers.py`(docker exec 管道传 JSON,无重启) | ✅ 5.44=393、5.202=393、5.60=394,抽查 9 用例三台全命中 |
| 39 | 08-25 | **薄弱模块 31 用例全量修复 R7 100%**`_navigate_to_target_page` 改走 `_do_navigate`(含 reload 兜底);`_ensure_micro_app_loaded` 阶段4 reload 修复;5 个探测脚本沉淀;14 个用例断言对齐 | ✅ 本地 31/31,799.7s |
......@@ -424,7 +491,9 @@ cd frontend && npm run build
- [ ] **排查搜索确定按钮 88s 卡点**(会话 38 新增资产闭环 Step 16/25 各 88s,功能通过但拉长总时长 254.9s)
- [ ] **预定2.0(meetingV2)独立页面探测与用例生成**(首页无独立直达入口,需从功能中心 Tab/`[data-id]` 入口探测)
- [ ] **薄弱模块 R7 修复部署三台服务器(5.44/5.202/5.60)**(会话 39 产出 `playwright_executor.py` 两处修复 + 14 个断言对齐用例。⚠️ 会话 40 已同步用例数据到位,但**执行器代码修复尚未部署**三台——远端薄弱模块仍可能复现 NO-BODY,需尽快部署;可复用 `deploy_to_544_5202.py`/`sync_to_560_full.py`
- [x] ~~**定时任务僵尸执行 + 重叠守卫**~~(会话 42 已修复并部署三台:`recover_interrupted_executions()` 启动恢复 + DB 级重叠兜底守卫 + lifespan 调用;清理 5.44/5.202/5.60 的 18/14/68 条 running 僵尸,对应 2606/1814/401 用例结果标 failed;324 测试全绿)
- [x] ~~**薄弱模块 R7 修复部署三台服务器(5.44/5.202/5.60)**~~(会话 43 完成:`playwright_executor.py` commit `a63d090c` 按安全流程部署三台,容器内 SHA 一致、健康检查通过;会话 40 用例数据 + 本次代码修复完整生效,远端薄弱模块 NO-BODY 解除。`deploy_executor_r7.py` 新增 `--artifact` 参数支持指定部署制品)
- [ ] **P1/P2 执行器代码部署三台(待部署)**(本地工作树含 `playwright_executor.py` P1b/P2 增强 + `smart_locate_service.py` + `smart_locate.py` + 前端 dist,须前端 `npm run build` 后一并部署)
- [ ] **monitor 内层路由被忽略**(微应用固定渲染设备列表,忽略 URL 内层 Maintenancelist/Filemanage 路由;相关用例已按实际渲染断言,如需真正内页需进一步探测侧边栏交互方案)
- [ ] 完善二级菜单映射表(`menu_mapping.py`
- [ ] 智能定位 API 与用例执行路径统一(当前两者逻辑分离)
......@@ -440,4 +509,4 @@ cd frontend && npm run build
---
*本文档由 Claude Code 于 2026-08-26 更新(会话 41:预定数据用例覆盖盲区补齐——6 个 navigate 直达用例 R1 一次 6/6 全绿,已同步三台服务器 5.44/5.202/5.60(各 +6 条);确认首页「预定数据」入口即数据统计页,独立「预定2.0(meetingV2)」无直达入口列为 P2 待办)。*
\ No newline at end of file
*本文档由 Claude Code 于 2026-08-27 更新(会话 43:薄弱模块 R7 执行器修复正式部署三台——`playwright_executor.py`(commit `a63d090c`)按安全流程(备份→上传→SHA-256→原子替换→docker restart→健康检查→容器内 AST/SHA 比对)部署 5.44/5.202/5.60,三台 6/6 验证全通过、容器内 SHA 均一致;`deploy_executor_r7.py` 新增 `--artifact` 参数;至此「执行器代码修复未部署」遗留闭环,远端薄弱模块 NO-BODY 解除,P1/P2 执行器代码仍为本地待部署)。*
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论