提交 97e802a6 authored 作者: 陈泽健's avatar 陈泽健

docs(ui-automation): 会话48 看门狗失败无报告修复完成并部署三台,同步 HANDOFF 与执行计划/问题处理文档状态

Co-Authored-By: 's avatarClaude <noreply@anthropic.com>
上级 f9b37c6b
# 执行计划 - 修复定时任务看门狗失败执行无报告输出
> **文档类型**: 执行计划文档
> **创建日期**: 2026-09-01
> **作者**: czj
> **关联文档**: [`_问题处理_定时任务看门狗失败执行无报告输出.md`](./_问题处理_定时任务看门狗失败执行无报告输出.md)
> **状态**: 已完成(A/B 全部实施并部署 5.44 / 5.202 / 5.60 三台,验证通过)
---
## 一、改动总览
| # | 改动项 | 文件 | 改动量 | 说明 |
|---|--------|------|--------|------|
| A1 | 新增 `_has_any_case_results` 辅助函数 | `backend/app/services/scheduler_service.py` | ~23 行 | 判断执行是否已有用例结果 |
| A2 | UI 路径报告生成条件修正 | 同上 | 2 行 | `run_ok``run_ok or _has_any_case_results` |
| A3 | Security 路径报告生成条件修正 | 同上 | 2 行 | 同上(统一行为) |
| B1 | case_results 写入 start_time | `execution_service.py` | 2 行 | 支持定位卡死用例 |
| B2 | 单用例执行超时兜底 | `execution_service.py` / `playwright_executor.py` | ~20 行 | 防止单一用例无限挂起 |
| B3 | Chromium 崩溃自动恢复 | `playwright_executor.py` | ~15 行 | 崩溃后重建页面/重试 |
---
## 二、A 修复(看门狗失败执行也生成报告)— 已实施
### A1 Step 1:新增 `_has_any_case_results`
**文件**`backend/app/services/scheduler_service.py`
`_has_running_security_execution` 后新增:
```python
from sqlalchemy import func, select # import 行追加 func
from app.models.case_result import CaseResult # import 行追加
async def _has_any_case_results(db, execution_id: str) -> bool:
"""
执行是否已产生任何用例结果。
看门狗把「长时间无进展」的执行标记为 failed 时,工作线程已被中断,
本执行走到的失败/成功用例结果已实时写库。此时虽非 run_ok,仍应生成
报告,否则 auto_report 任务的每次失败执行都无报告输出(5.44 事件形态:
每日任务连续 4 次看门狗失败、报告目录无一文件)。
Args:
db: 异步数据库会话
execution_id (str): 执行记录 ID
Returns:
bool: 已存在至少一条用例结果
"""
result = await db.execute(
select(func.count(CaseResult.id)).where(
CaseResult.execution_id == execution_id,
).limit(1)
)
return (result.scalar_one() or 0) > 0
```
### A2 Step 2:UI 路径报告生成条件
**文件**`backend/app/services/scheduler_service.py``run_task_once`,约原 340 行)
```python
# 5. 自动生成报告(执行成功后才生成,避免冲突失败记录产出空报告;
# 看门狗失败但已有用例结果也生成,避免多次失败执行无报告输出——
# 5.44 每日任务连续 4 次看门狗失败、报告目录无一文件)
if task.auto_report and (run_ok or await _has_any_case_results(db, execution.id)):
```
### A3 Step 3:Security 路径报告生成条件
**文件**`backend/app/services/scheduler_service.py``_run_security_task_once`,约原 216 行)
```python
# 5. 自动生成报告(执行成功后才生成;看门狗失败但已有用例结果也生成,
# 避免多次失败执行无报告输出——5.44 每日任务连续 4 次看门狗失败均无报告)
report_tried = False
if task.auto_report and (run_ok or await _has_any_case_results(db, execution.id)):
report_tried = True
try:
report_service = SecurityReportService()
await report_service.generate_report(execution.id, db)
logger.info(f"[定时任务] 安全任务「{task.name}」报告已生成: {execution.id}")
except Exception as e:
logger.error(f"[定时任务] 安全任务「{task.name}」生成报告失败: {e}")
```
### A4 验证(A 部分)
| 步骤 | 操作 | 预期结果 |
|------|------|----------|
| 1 | `python -c "import ast; ast.parse(...)"` 校验语法 | 无语法错误 |
| 2 | 部署到 5.44,复跑一次「每日定时」任务 | 无论如何结束,报告中心出现本次报告 |
| 3 | 被看门狗标记 failed 的执行 | 自动生成含已执行用例明细的报告 |
| 4 | 启动即异常、无任何用例结果的执行 | 不生成空报告 |
---
## 三、B 修复(定位并消除卡死点)— 已实施
### B1 Step 1:case_results 写入 start_time
**文件**`execution_service.py` `_persist_case_result`(约 673 行)
现状:只写 `end_time``start_time` 全表为 NULL → 无法定位卡死用例。
```python
case_result_obj.status = result.status
case_result_obj.duration = result.duration
case_result_obj.start_time = datetime.now() - timedelta(seconds=result.duration or 0)
case_result_obj.end_time = datetime.now()
```
> 说明:`result.duration` 为用例实际耗时,回推可得到准 start_time;后续若需精确到步骤级,再在 `execute_case` 开始时补写。
> **实际实施记录(2026-09-01)**:B2 最终未采用 ThreadPoolExecutor 方案(Windows 上多线程与 Playwright 专用线程不兼容,见 CLAUDE.md 约束 1),改为在 `playwright_executor.py` 内部实现**双层硬超时**:`_case_start_mono` 记录用例级开始时刻,`case_remaining_seconds()` 按 `case_hard_timeout`(默认 600s)计算用例级剩余时间;步骤级 `_step_deadline_mono` 按 `step_hard_timeout`(max(120, min(case_hard_timeout,600)-60))置位;`_do_in_micro_apps`/`_bounded_wait`/`_remaining_step_ms` 等所有等待点同时受步骤级与用例级截止点约束,任一先到即抛超时 → 该用例按失败处理并继续后续用例,单用例不可能无限挂起整次执行。
### B2 Step 2:单用例执行超时兜底
**文件**`execution_service.py` `run_all_cases_sync`(约 739 行)
在用例循环内对 `executor.execute_case()` 包一层超时控制:
```python
from concurrent.futures import ThreadPoolExecutor, TimeoutError as FutTimeout
_CASE_EXEC_TIMEOUT = 600 # 单用例硬超时(秒),超时按失败处理并继续
def _run_case_with_timeout(case_dict, callback):
with ThreadPoolExecutor(max_workers=1) as ex:
fut = ex.submit(executor.execute_case, case=case_dict, callback=callback)
try:
return fut.result(timeout=_CASE_EXEC_TIMEOUT)
except FutTimeout:
logger.error(f"用例执行超时(>{_CASE_EXEC_TIMEOUT}s),强制失败: {case_dict.get('name')}")
return None # 由外层构造失败 result
```
> 注意:此方案在 Windows 多线程下需验证与 Playwright 专用线程的兼容性(CLAUDE.md 约束 1)。备选:在 `execute_case` 内记录每个步骤开始时间,超时即标记失败并 `context` 级中断。
### B3 Step 3:Chromium 崩溃自动恢复
**文件**`playwright_executor.py`
历史日志显示 `Page crashed`/`Target crashed` 高频出现。在 `execute_case``try/except` 中捕获 Playwright 崩溃类异常,重建页面后重试一次(不重跑已成功步骤)。
### B4 验证(B 部分)
| 步骤 | 操作 | 预期结果 |
|------|------|----------|
| 1 | 1 条正常用例 | 不受影响,通过 |
| 2 | 构造卡死用例(`wait_for_timeout` 超长) | 触发单用例超时,标记失败并继续后续用例 |
| 3 | 触发 Page crash | 自动恢复或按失败处理,不无限挂起 |
| 4 | 全量 332 用例 | 不再 4~5 小时被看门狗判死 |
---
## 四、风险评估
| 风险 | 概率 | 影响 | 缓解 |
|------|------|------|------|
| A 修复对正常路径零影响 | 低 | 正常执行仍生成报告 | 条件为 `run_ok or has_results`,成功时行为不变 |
| B2 线程超时与 Playwright 兼容性 | 中 | 超时线程可能残留 | 先验证,优先选 execute_case 内超时方案 |
| B3 崩溃重试可能重复操作 | 中 | 重复点击/重复提交 | 仅对崩溃类异常重试且不重跑已成功步骤 |
---
## 五、部署步骤(5.44 / 5.202 / 5.60)— 已完成
```bash
# 1. 提交 A+B 修复代码
cd /e/github/ubains-module-test/platform-auto-test
git commit -m "fix(定时任务): 看门狗失败执行也生成报告 + 单用例超时兜底 + Chromium 崩溃恢复"
# 2. 同步后端到服务器宿主机并重启容器
python backend/scripts/deploy_44_202.py # 5.44 / 5.202(root)
python backend/scripts/deploy_fix_560.py --no-fix --runs 0 # 5.60(ubains,跳过生产用例变更与验收执行)
# 3. 容器日志轮转生效(json-file 50m × 5)
# 仅 docker restart 不会重新应用 compose logging 配置,需强制重建:
cd /data/third_party/plat-auto-test/deploy && docker compose up -d --force-recreate app
# 4. 验证容器内代码标记(scripts/verify_deploy_watchdog_fix.py 全量复核)
docker exec plat-auto-test-app grep -n '_has_any_case_results' /app/app/services/scheduler_service.py
```
**部署验收结果(2026-09-01)**
| 服务器 | 健康检查 | LogConfig | A/B1/B2/B3 代码标记 |
|--------|----------|-----------|--------------------|
| 5.44(:8081) | HTTP 200 healthy | `json-file` 50m×5 ✅ | 6/6 ✅ |
| 5.202(:8081) | HTTP 200 healthy | `json-file` 50m×5 ✅ | 6/6 ✅ |
| 5.60(:80) | HTTP 200 healthy | `json-file` 50m×5 ✅ | 6/6 ✅ |
容器均 `Up X minutes (healthy)`;MySQL / EMQX 不受影响(未重建)。
---
## 六、遗留问题
1. **case_results.start_time 历史数据全为 NULL** — 无法回溯定位历史卡死用例,仅对修复后生效(B1 已回推写入,后续执行可定位)
2. **宿主机与容器 data 目录不一致** — 宿主机 `/data/third_party/plat-auto-test/backend/data/reports/` 为空,容器 `/app/data/reports/` 有 4 个报告文件;需确认部署脚本是否同步该目录(影响报告持久化)
3. ~~**容器日志轮转策略未配置**~~ **已解决(2026-09-01)** — 三台服务器均通过 compose `logging: json-file 50m×5` 生效,`docker inspect` 确认 `{"Type":"json-file","Config":{"max-file":"5","max-size":"50m"}}`
4. **A/B 功能验证(执行级)待定** — 代码标记与健康状态已全部验证;建议后续在 5.44 触发一次「每日定时」任务执行,确认看门狗失败路径产出报告(可选,非阻塞)
---
*本文档由 Claude Code 生成,遵循项目执行计划文档规范。*
\ No newline at end of file
# 问题处理文档 - 定时任务看门狗失败执行无报告输出
> **文档类型**: 问题处理文档
> **创建日期**: 2026-09-01
> **作者**: czj
> **优先级**: P0
> **状态**: 已修复(待部署)
---
## 一、问题描述
### 1.1 现象
5.44 测试管理平台「每日定时自动化测试」任务每次执行的**执行中心均无报告输出**
- 用户在 5.44 平台执行中心查看 `exec_24b3a3291eb64760ae6045ae9ea1e198`(09-01 01:25:41 触发):
状态 = **failed**,error_message = *"执行长时间无进展,看门狗判定执行线程异常退出,自动标记为失败"*
**报告入口缺失**,容器内 `/app/data/reports/``report_exec_24b3a329_*.html` 文件。
### 1.2 复现范围(非偶发)
近 8 条「每日定时」任务执行的执行结果(全部无报告):
| 执行 ID | 开始 | 结束 | 结果 |
|---|---|---|---|
| exec_ef66c19a | 08-31 14:34 | 08-31 19:29 | ❌ 看门狗 failed(~4.9h) |
| exec_0ba3d399 | 08-31 20:35 | 09-01 01:25 | ❌ 看门狗 failed(~4.7h) |
| exec_24b3a329 | 09-01 01:25 | 09-01 06:09 | ❌ 看门狗 failed(~4.7h) |
| exec_fd29f4fe | 09-01 06:09 | 运行中… | ⏳ 本次执行中 |
每次执行约 4~5 小时后被看门狗判定失败,**连续 4 次失败、0 次报告输出**
### 1.3 影响范围
- 每天多次定时执行**全部无报告可看**,失败原因无法在报告中心呈现
- 定时任务形同虚设:用户无法通过报告中心查看任何一次执行结果
---
## 二、根因分析
### 2.1 报告生成条件(代码根因)
`backend/app/services/scheduler_service.py``run_task_once()`
```python
# 4. 运行执行(阻塞等待完成;内部全局锁保证串行)
run_ok = True
try:
await exec_service.run_execution(execution.id)
except Exception as e:
run_ok = False
logger.error(...)
# 5. 自动生成报告(执行成功后才生成)
if task.auto_report and run_ok:
generate_html + save_report
```
**`run_ok` 仅在 `run_execution()` 正常返回、不抛异常时为 True。**
当看门狗判定执行「长时间无进展」时:
1. `execution_service.watchdog_scan_once()` 将 executions 表该记录置为 **failed**`duration=0`,写入看门狗 error_message),并把剩余 pending/running 的 case_results 批量置 failed;
2. 工作线程已被中断,`run_execution()` 提前返回/抛异常;
3. `scheduler_service``run_ok=False`**报告生成被跳过**
### 2.2 既有数据可行性(修复依据)
执行被看门狗标记失败时,**213 条 passed / 95 条 failed 用例结果已实时写库**`_persist_case_result` 逐条 commit),仅剩 24 条 pending 被批量置 failed。`ReportService.generate_html()` 只读取 `case_results` 表渲染,**failed 执行同样能输出完整结果页**
### 2.3 卡死点排查结论(B 并行排查)
| # | 结论 | 证据 |
|---|------|------|
| 1 | 每次执行都在「信息发布/消息通知」之后卡住,最终被看门狗标记 | 24b3a 最后一条完成 = 信息发布-页面访问验证 05:51:35;其后 24 条 pending 批量置 failed(下载列表/通讯录/预定数据/信息管理/门口屏发布等) |
| 2 | **case_results.start_time 从未写入**`_persist_case_result` 只写 end_time)| 全表 start_time 为 NULL → 无法精确定位卡死的那条用例 |
| 3 | 容器日志早于 8-29 已轮转,9-01 卡死时段无日志可取证 | `docker logs` 仅含 8-29 内容 |
| 4 | 历史日志可见 Chromium **页面崩溃高频**`Page crashed`/`Target crashed`/`Target closed`)| 8-29 日志 "导航到主页失败(不影响后续执行): Page crashed"、"步骤 1 尝试 1/3 失败... Target crashed" |
| 5 | 当前执行 fd29f4fe 健康(30 分钟产出 41 条结果),非全链路卡死 | DB 实况 |
| 6 | 执行无「单用例超时兜底」:Playwright 在 tab 崩溃/页面无响应场景下,`evaluate`/`goto` 可长时间挂起 | `playwright_executor.py` 各操作 timeout 均为单步超时(默认 30s),无整用例上限 |
**卡死根因推断**:执行长跑 4~5 小时后 Chromium 页面/tab 崩溃或目标系统页面无响应,某用例交互操作在崩溃态下挂起且无整用例超时兜底 → 30 分钟无任何进展 → 看门狗判定 failed。需要后续专项治理(见计划执行文档 B 部分)。
---
## 三、修复方案
**A 修复(本次已实施)**:看门狗失败执行也生成报告。
修改 `scheduler_service.py`
1. 新增 `_has_any_case_results(db, execution_id)` 辅助函数——查询该执行是否已产生任何用例结果;
2. UI 与 security 两条路径的报告生成条件由
`task.auto_report and run_ok`
改为
`task.auto_report and (run_ok or await _has_any_case_results(db, execution.id))`
效果:执行被看门狗标记 failed 但已有结果时,自动生成报告(默认渲染完整结果页),失败执行不再"静默无报告"。
**B 后续治理(本次仅排查,未改码)**:定位并消除卡死点,见计划执行文档。
---
## 四、验收标准
| 测试项 | 预期结果 |
|--------|----------|
| 定时任务执行成功 | 正常生成报告(行为不变) |
| 定时任务被看门狗标记失败(已有用例结果) | 自动生成报告,含已执行用例的通过/失败明细 |
| 定时任务启动即异常、无任何用例结果 | 不生成空报告(保持原守卫) |
| 手动「立即执行」触发 | 报告生成行为不变(仅影响定时任务) |
---
## 五、相关文件
- `backend/app/services/scheduler_service.py` — 报告生成条件(A 修复改动点)
- `backend/app/services/execution_service.py` — 看门狗逻辑(`watchdog_scan_once`,B 排查对象)
- `backend/app/services/report_service.py` — HTML 报告生成(只读 case_results,失败执行可渲染)
- 容器报告目录:`/app/data/reports/`(宿主机路径独立,非 `/data/third_party/...`
---
*本文档由 Claude Code 生成,遵循项目问题处理文档规范。*
\ No newline at end of file
# HANDOFF — UI自动化测试交接文档
> **生成时间**: 2026-08-31
> **生成时间**: 2026-09-01
> **当前分支**: `platform-auto-test`
> **最近提交**: `4e19844c` docs(perf): 记录 Java 进程瞬时 CPU 监控修复会话进度到 HANDOFF
> **状态**: 🟢 **会话47:性能测试模块目标机监控增强与修复(Batch A 多 PID 聚合/MySQL 趋势 + Batch B JSTAT 瞬时 CPU)部署 5.60,均已推送 origin/platform-auto-test**
> **最近提交**: `f9b37c6b` fix(deploy): deploy_fix_560 补充 performance_ai_service/resource_monitor 传递依赖上传
> **状态**: 🟢 **会话48:定时任务看门狗失败执行无报告输出修复(已全部完成并部署 5.44/5.202/5.60,日志轮转已生效,验证通过;仅剩可选执行级端到端抽查)**
---
## 📊 当前状态(会话 48,2026-09-01)
**定时任务看门狗失败执行无报告输出(P0)**:5.44「每日定时自动化测试」连续 4 次被看门狗判失败、**报告目录无一文件**(最近一次 `exec_24b3a329` 09-01 01:25~06:09 约 4.7h 后看门狗标记 failed)。根因 = `scheduler_service.run_task_once()` 报告生成条件 `task.auto_report and run_ok`,看门狗置 failed 后 `run_ok=False` → 报告被跳过;而被判死时 213 passed / 95 failed 用例结果已实时写库,`ReportService.generate_html()` 只读 case_results 渲染,failed 执行完全能出报告。
### ✅ A 修复(看门狗失败执行也生成报告)— 已实施并部署三台
| 改动 | 文件 |
|------|------|
| 新增 `_has_any_case_results(db, execution_id)` 辅助函数:查询该执行是否已有用例结果 | `scheduler_service.py` |
| UI 路径报告生成条件:`run_ok``run_ok or await _has_any_case_results(...)` | 同上(line ~370) |
| Security 路径同条件统一(`_run_security_task_once`) | 同上(line ~243) |
- git diff +35/-5;语法已通过 `ast.parse` 校验;已提交 `80bbb6ac` 并部署 5.44/5.202/5.60(见下「部署完成」)
- 验收:成功执行行为不变;看门狗失败但有结果 → 出报告;启动即异常无结果 → 不出空报告
### 🔍 B 卡死点排查结论(并行,6 条证据)
| # | 结论 | 证据 |
|---|------|------|
| 1 | 每次执行都卡在「信息发布/消息通知」之后,最终被看门狗标记 | 24b3a 最后一条完成 05:51:35,其后 24 条 pending 批量置 failed |
| 2 | **case_results.start_time 从未写入**`_persist_case_result` 只写 end_time),全表 NULL → 无法精确定位卡死用例 | DB 全表扫描 |
| 3 | 容器日志已轮转(仅剩 8-29),9-01 卡死时段无日志可取证 | `docker logs` 仅含 8-29 内容;无 max-size 配置 |
| 4 | 历史日志 Chromium 页面崩溃高频(`Page crashed`/`Target crashed`/`Target closed`) | 8-29 日志 |
| 5 | 当前执行 fd29f4fe 健康(30 分钟产出 41 条结果),非全链路卡死 | DB 实况 |
| 6 | 无「单用例超时兜底」:单步超时 30s 有,整用例可无限挂起 | `playwright_executor.py` 各操作 timeout |
**卡死根因推断**:长跑 4~5h 后 Chromium 页面/tab 崩溃或目标系统无响应 → 用例操作在崩溃态挂起 → 30 分钟无进展 → 看门狗判死。B 治理(start_time 写入 / 单用例超时兜底 / CPU 崩溃恢复)见执行计划文档。
### ✅ 部署完成(A+B+日志轮转,三台服务器验证通过)
**提交**`80bbb6ac`(A `_has_any_case_results` + B1 start_time 回推 + B2 双层硬超时 + B3 崩溃恢复,含 `deploy/docker-compose.yml` logging 配置)+ `f9b37c6b`(deploy_fix_560 补传递依赖)。**后端测试 364/364 全绿**
**B2 方案最终形态**(未用 ThreadPoolExecutor——Windows 与 Playwright 专用线程不兼容):`playwright_executor.py` 内部双层硬超时——`_case_start_mono` + `case_remaining_seconds()``case_hard_timeout` 默认 600s)+ 步骤级 `_step_deadline_mono``step_hard_timeout` = max(120, min(case_hard_timeout,600)-60));`_do_in_micro_apps`/`_bounded_wait`/`_remaining_step_ms` 所有等待点同受步骤级+用例级截止点约束,任一先到即抛超时 → 该用例按失败处理并继续,单用例不可能无限挂起整次执行。
**B3 方案**`_is_crash_error` 识别 10 类崩溃标记(`Page crashed`/`Target crashed`/`Target closed`/`browser has been closed` 等)→ `_rebuild_page_after_crash``_context.new_page()` + 重挂 webdriver 隐藏 init script + `_detect_login_state()` 重新登录态探测,或 stop()+start())→ 从失败步骤重试(不重跑已成功步骤),`_crash_retried` 每用例重置。
**部署**`deploy_44_202.py`(5.44/5.202,root)+ `deploy_fix_560.py --no-fix --runs 0`(5.60,ubains)。**日志轮转**:三台服务器 compose 注入 `logging: json-file 50m×5``docker compose up -d --force-recreate app` 生效(仅 `docker restart` 不重新应用 compose logging 配置)。
**验收(2026-09-01)**
| 服务器 | 健康检查 | LogConfig | A/B1/B2/B3 标记 | 容器状态 |
|--------|----------|-----------|----------------|----------|
| 5.44(:8081) | 200 healthy | `json-file` 50m×5 ✅ | 6/6 ✅ | Up (healthy) |
| 5.202(:8081) | 200 healthy | `json-file` 50m×5 ✅ | 6/6 ✅ | Up (healthy) |
| 5.60(:80) | 200 healthy | `json-file` 50m×5 ✅ | 6/6 ✅ | Up (healthy) |
MySQL / EMQX 容器未重建、数据无影响。遗留 1 项:**执行级功能验证待定**(在 5.44 触发一次「每日定时」确认看门狗失败路径产出报告,可选非阻塞)。
### 📄 文档产出
| 文档 | 状态 |
|------|------|
| `_问题处理_定时任务看门狗失败执行无报告输出.md` | 含根因分析 + A 修复方案 + 验收标准 |
| `_执行计划_修复定时任务看门狗失败执行无报告输出.md` | A+B 已实施 + 三台部署验收表 + 遗留问题(状态:已完成) |
---
......@@ -508,6 +565,8 @@ button:has-text('确定')
| 会话 | 日期 | 主题 | 结果 |
|------|------|------|------|
| 48 | 09-01 | **定时任务看门狗失败执行无报告输出(P0)**:根因=报告生成条件 `run_ok`,看门狗置 failed 后跳过报告;A 修复新增 `_has_any_case_results`,UI/Security 两条路径 `run_ok or has_results` 均生成报告;B1 start_time 回推 + B2 双层硬超时兜底 + B3 崩溃恢复;已部署 5.44/5.202/5.60 三台(提交 `80bbb6ac`/`f9b37c6b`,364 测试全绿,6/6 标记验证通过),容器日志轮转 50m×5 已生效;产出问题处理 + 执行计划文档 | ✅ 已部署三台 |
| 47 | 08-31 | **性能测试目标机监控增强与修复**:Batch A 5 Java 关键字 + 多 PID 聚合 + MySQL 趋势;Batch B JSTAT 瞬时 CPU 采样(ps 平均失真修复);15 项单测全绿;部署 5.60 | ✅ 已部署 + 已推送 origin |
| 46 | 08-31 | **执行耗时优化 P0/P1/P2**`step_retry_count` 默认 2→1;has-text 25s→10s / 表格行 150s→30s / checkbox 40s→20s / iframe 5s→3s;新增 `_selector_exists_fast` 快速失败探测;9 项单测 + 全量 352 通过;`deploy_timeout_opt.py` 部署三台;5.44 同一 10 用例定时任务 24.8min→10.2min(-59%),通过率 30% 无回归 | ✅ 三台部署 + 生产实测达标 |
| 45 | 08-31 | **截图定期清理 + 5.60 磁盘满修复**`cleanup_service.py` 新增 `cleanup_screenshots_loop`(3600s 间隔/3 天保留)+ `config.py` 新增 `SCREENSHOT_RETENTION_DAYS` + `main.py` lifespan 启动/停止;10 项单元测试;5.60 因 `projects` router 引用崩溃→回滚→移除→重部署;三台部署完成(5.60 首轮清理释放 8.77GB) | ✅ 三台 6/6 验证通过 |
| 44 | 08-29 | **僵尸执行常驻看门狗**:新增 `watchdog_loop`(60s 扫描/30 分钟无进展判僵尸/双信号活性判定:内存心跳 + DB 结果增长)+ `deploy_watchdog.py`;5.202/5.60 部署完成(清理 8/27 僵尸) | ✅ 看门狗已启动 |
......@@ -602,6 +661,8 @@ cd frontend && npm run build
| 语义化用例执行 PRD/计划 | `Docs/PRD/需求文档/用例管理/_PRD_复杂用例通用执行机制_语义化用例执行.md` |
| 定时任务模块 PRD/计划 | `Docs/PRD/需求文档/定时任务/_PRD_需求文档_UI自动化定时任务模块与系统配置被测系统URL.md` |
| 执行耗时优化 PRD/计划 | `Docs/PRD/需求文档/执行中心/_PRD_需求文档_执行耗时优化.md` / `_执行计划_执行耗时优化.md` |
| 定时任务看门狗失败无报告问题处理 | `Docs/PRD/问题处理/执行中心/_问题处理_定时任务看门狗失败执行无报告输出.md` |
| 定时任务看门狗失败无报告执行计划 | `Docs/PRD/问题处理/执行中心/_执行计划_修复定时任务看门狗失败执行无报告输出.md` |
| P1 遗留待办 PRD/计划 | `Docs/PRD/需求文档/用例管理/_PRD_需求文档_P1遗留_验证步骤前端适配与定位器优化.md` |
| 新建会议问题处理 | `Docs/PRD/问题处理/会议管理/_问题处理_新建会议用例执行失败_页面直达后会议室表格checkbox不可见.md` |
| HANDOFF 总交接 | `HANDOFF.md` |
......@@ -612,6 +673,15 @@ cd frontend && npm run build
## ✅ 待办事项(仅未完成)
### P0(本次会话产出,已完成 → 移至下方会话 48 部署记录)
- [x] ~~**提交 + 部署 A 修复(看门狗失败执行也生成报告)**~~(会话 48 完成:`_has_any_case_results` 已提交 `80bbb6ac` 并部署 5.44/5.202/5.60;容器内标记复核 6/6 ✅)
- [x] ~~**B1:case_results 写入 start_time**~~(会话 48 完成:`_persist_case_result``start_time = now - duration`,已提交部署)
- [x] ~~**B2:单用例执行超时兜底**~~(会话 48 完成:`playwright_executor.py` 双层硬超时——`_case_start_mono` + `case_remaining_seconds()` + 步骤级 `_step_deadline_mono`,所有等待点同受步骤级+用例级截止点约束;已提交部署)
- [x] ~~**B3:Chromium 崩溃自动恢复**~~(会话 48 完成:`_is_crash_error` 识别 10 类崩溃标记 + `_rebuild_page_after_crash` 重建页面从失败步骤重试,`_crash_retried` 每用例重置;已提交部署)
- [x] ~~**容器日志轮转配置**~~(会话 48 完成:compose `logging: json-file 50m×5` + `docker compose up -d --force-recreate app`,三台 `docker inspect` 确认生效)
- [ ] **(可选)执行级功能验证**:在 5.44 触发一次「每日定时」任务,确认看门狗失败路径产出报告(代码标记与健康已全量验证,此项为端到端抽查)
### P2(低优先级)
- [ ] **观察 5.44 定时任务通过率**(会话 46 P0 把重试 3→2 次尝试;若后续通过率下降,回滚 P0 保留 P1+P2)
......@@ -635,4 +705,4 @@ cd frontend && npm run build
---
*本文档由 Claude Code 于 2026-08-31 更新(会话 46:执行耗时优化 P0/P1/P2——`step_retry_count` 默认 2→1 + has-text/表格行/checkbox/iframe 超时收紧 + `_selector_exists_fast` 快速失败探测;9 项单测 + 全量 352 通过;`deploy_timeout_opt.py` 部署 5.44/5.202/5.60;5.44 同一 10 用例定时任务 24.8min→10.2min(-59%),通过率 30% 无回归;「小模块定时任务验证」已启用)。*
\ No newline at end of file
*本文档由 Claude Code 于 2026-09-01 更新(会话 48:定时任务看门狗失败执行无报告输出修复——**已完成**:A `_has_any_case_results` + UI/Security 两条路径 `run_ok or has_results` + B1 start_time 回推 + B2 双层硬超时兜底 + B3 Chromium 崩溃恢复 + 容器日志轮转 50m×5,全部提交(`80bbb6ac`/`f9b37c6b`)并部署 5.44/5.202/5.60 三台,364/364 测试全绿,6/6 代码标记验证通过,LogConfig 生效;遗留:可选执行级端到端抽查)。*
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论