Files
lhl 80daadcd31 fix(websocket): 修复 app.py 不可导入并新增真实链路验证
- 将 /api/sessions/{sid}/ws 端点移入 create_app(此前置于模块级导致整模块 import NameError,回归被验证拦截)
- register_loop + subscribe 调整至 accept 之前,缩小连接已开但未订阅期间的进度丢失窗口
- 新增 tests/test_verify_ws_real_flow.py:驱动真实 HTTP 聊天流程断言 WS 收到 agent 实际发射的 parse/impact 进度
- 同步 WebSocket 计划文档 Task 3 代码片段(标注端点必须位于 create_app 内)
- 全量 pytest 实测 583 passed / 99.03% 达标
2026-08-29 14:36:12 +08:00

2.7 KiB
Raw Permalink Blame History

WebSocket 进度流端到端测试 — Task 5 报告

  • 状态:完成
  • 分支feat/websocket-progress
  • Commit 短哈希6cb92e3
  • 提交信息test(chat): WebSocket 进度流端到端冒烟 + design.md 记录
  • 提交文件tests/test_progress_e2e.pydocs/design.md(未提交 _AI_USAGE_LOG.md,由主控另行处理)

全量 pytest 结果

  • 命令:python -m pytest -q(含覆盖率门禁 fail_under=99
  • 结果:582 passed
  • 覆盖率:99.03%(要求 ≥ 99% → 达标

tests/test_progress_e2e.py 内含:

  • test_ws_progress_during_generate:按 Task 5 给定脚本,验证真实会话 + 样本文件上传后,WS 在会话期间可投递 progress 事件。
  • 补充测试(用于在提交态下满足覆盖率门禁,均落在 test_progress_e2e.py,随本次提交):
    • test_ws_progress_second_emit_after_disconnect:覆盖 app.pyexcept WebSocketDisconnect: pass 分支。
    • test_static_chat_ws_served / test_projects_endpoints_noop:覆盖 /chat_ws.js/chat_state.js、项目配置端点分支。
    • test_app_real_engine_skips_fake_branch:覆盖 app.py engine 非 fake 非 None 的跳转分支。
    • test_hub_emit_without_loop_fallback / test_hub_unsubscribe_unknown_queue_noop / test_hub_unsubscribe_leaves_other_subscribers:覆盖 hub.py 的无循环兜底与退订边界分支,将 hub.py 由 88% 提升至 100%

Node 单测结果

  • 命令:node --test tests/test_chat_ws.js
  • 结果:2 passedapplyProgressEvent 的 progress / error 角色渲染均通过)

疑虑与说明

  • 覆盖率是否达标:本次运行 99.03%,达到 99% 门禁。但需注意:达标是「勉强通过」级别。剩余未覆盖项集中在 app.py119/126/147/153/162),均为「文件已存在 / 未配置项目」时的 404 防御分支,在本仓库实际文件布局下不可达(属死分支),无法通过补充测试覆盖且不应降低门禁。
  • 门禁脆弱性:当前全量覆盖率距红线仅约 0.03 个百分点,依赖本次新增的 hub 边界测试与 WS 断开测试。若后续在本分支移除这些补充测试或改动 app.py,极易跌破 99%。建议在 app.py 对应防御分支补充「文件缺失 / 无项目」的显式测试(需临时移除静态文件或构造无项目 store)以增厚余量。
  • test_progress_e2e.py 在给定脚本基础上追加了补充测试函数,原 test_ws_progress_during_generate 保持「照抄」未改动;补充测试均归入同一文件以确保提交态即可通过覆盖率门禁(避免新增未提交文件导致门禁在干净提交态失效)。