Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录
切换导航
U
ubains-module-test
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
1
议题
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
郑晓兵
ubains-module-test
Commits
97e802a6
提交
97e802a6
authored
9月 01, 2026
作者:
陈泽健
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
docs(ui-automation): 会话48 看门狗失败无报告修复完成并部署三台,同步 HANDOFF 与执行计划/问题处理文档状态
Co-Authored-By:
Claude
<
noreply@anthropic.com
>
上级
f9b37c6b
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
412 行增加
和
5 行删除
+412
-5
_执行计划_修复定时任务看门狗失败执行无报告输出.md
Docs/PRD/问题处理/执行中心/_执行计划_修复定时任务看门狗失败执行无报告输出.md
+210
-0
_问题处理_定时任务看门狗失败执行无报告输出.md
Docs/PRD/问题处理/执行中心/_问题处理_定时任务看门狗失败执行无报告输出.md
+127
-0
HANDOFF_UI自动化.md
HANDOFF_UI自动化.md
+75
-5
没有找到文件。
Docs/PRD/问题处理/执行中心/_执行计划_修复定时任务看门狗失败执行无报告输出.md
0 → 100644
浏览文件 @
97e802a6
# 执行计划 - 修复定时任务看门狗失败执行无报告输出
> **文档类型**: 执行计划文档
> **创建日期**: 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
Docs/PRD/问题处理/执行中心/_问题处理_定时任务看门狗失败执行无报告输出.md
0 → 100644
浏览文件 @
97e802a6
# 问题处理文档 - 定时任务看门狗失败执行无报告输出
> **文档类型**: 问题处理文档
> **创建日期**: 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自动化.md
浏览文件 @
97e802a6
# HANDOFF — UI自动化测试交接文档
> **生成时间**: 2026-0
8-3
1
> **生成时间**: 2026-0
9-0
1
> **当前分支**: `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
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论