5.6 KiB
Wave 0 P0 Bug 修复测试报告
一、 测试背景 (Background)
系统体检(2026-09-17)确认 SSE 聊天/任务流被全局 WriteTimeout=120s 强杀、run/stream 畸形 body 误启任务与 Flush 后失败、前端会话窗口缓存 key 不一致、IndexedDB 恢复覆盖新增交付物。本波次按整改方案 Wave 0 实施 B-1~B-6。
二、 测试目标 (Test Objectives)
- B-1/B-2:
handleChatStream/handleRunTaskStream心跳 +extendSSEWriteDeadline,长静默不因 WriteTimeout 断流 - B-3:畸形 JSON → HTTP 400,不开 SSE
- B-4:
CreateAndStart/Subscribe在 Flush 前;失败为普通 JSON 错误 - B-5:
saveSessionWindowCache一律带userId;LRU 驱逐完整 cache key - B-6:
applyRestoredFileRaw函数式合并,不丢 mount 后新增 deliverable - 质量门禁:
go vet/go test -short/npm test/npm run build全绿;dev rebuild + health/ready
三、 测试方案与环境 (Test Plan & Environment)
- OS:Linux;Go 模块全量
-short;前端tsx --test+ vitest - 后端 Stub 单测 + 真实 dev 容器(
pi-agent+ MiniMax-M2.7-highspeed) - 分支:
fix/wave0-p0-sse-chat-cache-bugs→ 合入本地dev@810fb96(后随 docs 再合) - 资产:
.doc/test-reports/assets/2026-09-18-wave0-p0-bug-fixes/
四、 预期结果 (Expected Results)
| 用例 | 预期 |
|---|---|
| 畸形 run/stream body | 400,非 text/event-stream |
| CreateAndStart 注入失败 | 非 SSE Content-Type,正文含 start failure |
| 短 WriteTimeout + 心跳 | 流时长 > WriteTimeout 仍可读到 done |
| 缓存写路径 | 全部调用含 userId;超 LRU 驱逐带前缀 key |
| restore 合并 | prev 新增条目保留,仅补丁 fileRaw |
| 真实 PI 聊天 | 静默生成期出现 : heartbeat,最终 event: done |
五、 实际测试结果与判定 (Actual Results & Evaluation)
5.1 后端单测(internal/server/sse_wave0_test.go)
测试输入:go test -short -count=1 ./internal/server/ -run 'TestRunTaskStream_InvalidJSON|TestRunTaskStream_CreateAndStartFails|TestSSEHeartbeat_Helpers|TestRunTaskStream_ValidBody' -v
实际输出(摘要):
--- PASS: TestRunTaskStream_InvalidJSON_Returns400 (0.14s)
--- PASS: TestRunTaskStream_CreateAndStartFails_BeforeSSEFlush (0.12s)
--- PASS: TestSSEHeartbeat_HelpersSurviveShortWriteTimeout (0.70s)
--- PASS: TestRunTaskStream_ValidBody_OpensSSEWithHeartbeatPath (0.17s)
PASS
评价判定:PASS
性能与耗时:约 1.1s 包级
5.2 前端单测
测试输入:
npx tsx --test src/hooks/useChatWindow.cacheKey.test.ts \
src/data/storage.windowCache.test.ts src/data/fileStore.test.ts
实际输出:
✔ applyRestoredFileRaw: 以 prev 为权威…
✔ applyRestoredFileRaw: 无可用 fileRaw 时返回同一引用
✔ window cache LRU: 驱逐带 userId 前缀的完整 cache key…
✔ window cache: 读写同一 userId 前缀,跨用户不串读
✔ useChatWindow: 所有 saveSessionWindowCache 调用必须传入 userId
ℹ tests 5 / pass 5
评价判定:PASS
5.3 全量回归
| 命令 | 结果 |
|---|---|
go vet ./... |
PASS |
go test -short -count=1 ./... |
全包 ok(含 server) |
cd web && npm test |
397 + 32 vitest PASS |
cd web && npm run build |
PASS(含 precompress) |
5.4 dev 容器冒烟
测试输入:./scripts/env-service.sh dev rebuild;curl -sf http://127.0.0.1:8080/health 与 /ready
实际输出:
{"status":"ok","env":"dev","agent_backend":"pi-agent","schema_version":52,"schema_ready":true,...}
评价判定:PASS
5.5 真实 PI 聊天 SSE(心跳接线证据)
测试输入:admin 登录后 POST /api/v1/chat/stream,长合规分析提示词;资产见 assets/2026-09-18-wave0-p0-bug-fixes/chat-stream-long.sse.txt
实际输出(关键片段):
event: phase
...
: heartbeat 1789663534
: heartbeat 1789663549
: heartbeat 1789663564
: heartbeat 1789663579
event: delta
...
event: done
data: {...,"done":{"duration_ms":70164,"status":"completed",...}}
评价判定:PASS(真 PI 回合约 70s;静默生成期 4 次心跳,流完整收尾)。
说明:绝对墙钟 >120s 的真 PI 未再压测(二次加长提示触发 SECURITY_FORBIDDEN 快速返回);WriteTimeout 跨越由 TestSSEHeartbeat_HelpersSurviveShortWriteTimeout(WriteTimeout=200ms,流 700ms)覆盖,与线上心跳机制同源。
六、 自动化测试套件汇总 (Test Suite Execution)
- Go:
go vet ./...+go test -short -count=1 ./...→ 全绿 - Web:
npm test(397 node:test + 32 vitest)+npm run build→ 全绿 - 新增:
sse_wave0_test.go、useChatWindow.cacheKey.test.ts、storage.windowCache.test.ts、fileStore.test.ts
七、 测试结论与后续优化建议 (Conclusion & Next Steps)
- Wave 0(B-1~B-6)达到合入与冒烟标准,可关闭 short-term 任务。
- 后续:Wave 1(E-1 main ENV)仍待决策;可选补一次刻意 >120s 的受控长任务(例如阻塞 executor 的 task run events)作为额外证据。
- 红线未触碰:FAV / MULTI_INTENT_PLAN_TIER / SEMANTIC_SUMMARY_REPLACE / 项目 143。