oh-my-muse/docs/plans/2026-06-20-001-test-全量e2e真跑通-plan.md
lili 99f8fcd2e0 test(e2e): 全量 e2e 9 spec/22 用例本地活体全绿 + binding 种子固化
PG 宿主 100.64.0.8 恢复在线→查出旧 jar(Jun-19 00:59)缺 GET bindings 端点(commit 3a7a72f Jun-19 13:30)致 405→rebuild Jun-20 新 jar(反假绿:不用过时 jar)→起栈 48080(local,infra,清 socks)→playwright MSW-off 真打:22 passed/0 failed/0 skipped/0 flaky(9.1s)。

覆盖:accept-suggestion 正负×2 + account-security-ack + agent-create + knowledge-bindings(06-19 PG 离线阻塞项 unblock) + knowledge-confirm + knowledge-graph + live-read×6 + market-publish×8 + workspace。

种子:核验 4/5 基础数据在,knowledge-bindings 投影固化进 e2e/global-setup.ts #6(可入库、下次自动补,补此前未覆盖项);0 红故无就地修。回写进度总账 §五C + 总览待办(受阻→完成) + spec 注释。附本会话 ce-brainstorm/ce-plan 产出文档。

诚实边界:本地全栈活体(rebuild jar + 真 PG muse_slice_live),非 CI(maven.yml 不跑 e2e/需活体后端+浏览器)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 13:53:29 -07:00

113 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# test: 全量 e2e 真跑通 + 测试结论台账
- 日期2026-06-20
- 类型test验证
- 深度Standard
- Origin[`docs/brainstorms/2026-06-20-studio-ui端面与e2e真跑通-requirements.md`](../brainstorms/2026-06-20-studio-ui端面与e2e真跑通-requirements.md)
- Target repooh-my-muse`muse-studio` e2e + `muse-cloud` 后端)
---
## Summary
把 muse-studio 既有 **9 个 playwright e2e spec** 在真实全栈muse-server 48080 + PG `muse_slice_live` + redis上**全部真实跑一遍**,消除"待实跑"妥协。配套:基础种子**固化为可入库脚本**(替代一次性 `/tmp/*.java`、补 global-setup 未覆盖项);跑红**就地修**(含后端潜伏 bug反假绿最终整理测试结论**回写进度台账**。
## Problem Frame
接口覆盖门 233/233 只验证后端接口层,≠ 端到端可用。e2e 此前因 PG 宿主 `100.64.0.8:5433` 离线停留在"待实跑"。**2026-06-20 PG 恢复在线**直连可达、Flyway 24 全绿、165 表),全栈起栈配方现成(`.agents/knowledge/external-deps-and-gotchas.md` §六),本会话已坐实 muse-server READY`Started in 19.437s`48080
最大不确定性有二:① **基础种子完整性**——`global-setup.ts` 每轮自动复位 5 类 fixture但假定基础数据已存在基础数据历史靠一次性 `/tmp/*.java`每会话丢失knowledge-bindings 投影 global-setup 未覆盖。② **首次全量真跑可能暴露潜伏红**——部分 spec如 knowledge-bindings从未活体运行过。
## Requirementstrace origin
- **R1**origin 目标 29 个 e2e spec 全部真实跑通(绿)。
- **R2**origin 目标 3测试结论台账——每 spec 状态/证据/修复,回写进度总账。
- **R3**origin 完成标准):端到端 e2e 实跑绿,非"待实跑";全栈真实后端 + 真 PG。
- **R4**(本轮 call-out 决策):基础种子固化为可入库;红用例就地修(含后端)。
## Key Technical Decisions
1. **基础种子固化为可入库**global-setup 扩展 / 独立 seed不再用一次性 `/tmp/*.java`——复利、反每会话丢失,延续 `global-setup.ts` 自身"可入库版替代 /tmp"的既定方向。
2. **红就地修**(含后端潜伏 bug——e2e 真绿才算完成,掩盖红=假绿。沿用历史模式publish 部分索引→V22、confirm 重名 500→预检
3. **起栈用 §六 现成配方**profile=`local,infra`、清 JVM socks`-DsocksProxyHost=`、AI 调度熄火(超大 delay`--muse.codegen.import-enable=false`
4. **PG = `muse_slice_live`100.64.0.8:5433**,凭据走 env`~/.config/muse-repo/infra.env`**绝不入库**。
5. **结论回写进度总账 + 总览**,不新增过程文档(单一台账偏好)。
---
## Implementation Units
### U1. 全栈起栈就绪(前置)
- **Goal**muse-server 单体在 48080 起栈,连 `muse_slice_live` + 本机 redisAI 调度熄火、socks proxy 清除。
- **Requirements**R3。
- **Dependencies**:无(起点)。
- **Files**`.agents/knowledge/external-deps-and-gotchas.md`(§六 配方,参照不改)、`muse-cloud/muse-server/target/muse-server.jar``~/.config/muse-repo/infra.env`(仓外凭据)。
- **Approach**:本机 redis`--requirepass`)→ `set -a; . infra.env; set +a` → 按 §六 `java -DsocksProxyHost= … -jar muse-server.jar --spring.profiles.active=local,infra --spring.flyway.baseline-on-migrate=true --muse.codegen.import-enable=false`。jar 现为 Jun-19 build本会话未改后端可复用若 U4 改后端则 `mvn -pl muse-server -am package`classifier=exec 已配)后重起。本会话已起栈 READY可直接复用。
- **Test scenarios**Covers R3. 健康探针 `curl --noproxy '*' -H "Authorization: Bearer test1" -H "tenant-id: 1" -H "X-API-Version: 1" http://localhost:48080/app-api/muse/works?pageNo=1&pageSize=5``code:0`;日志含 `Started MuseServerApplication`
- **Verification**48080 健康返回 `code:0`redis PONGPG 直连可达。
### U2. 基础种子核验 + 固化为可入库脚本
- **Goal**:核验 `muse_slice_live` 的 e2e 基础数据完整性,缺失项固化为**可入库基础种子**,补 global-setup 未覆盖的 knowledge-bindings 绑定投影。
- **Requirements**R1、R4。
- **Dependencies**U1。
- **Files**`muse-studio/e2e/global-setup.ts`(扩展基础种子段)或新建 `muse-studio/e2e/seed-base.ts`;参照历史已丢失的 `/tmp/{SeedSec,KnowledgeGraphSeed,SetReqStatus,SeedAppeal,SetAppealSup}.java`(按各 spec 注释 + global-setup 复位逻辑反推语义)。
- **Approach**:① 连 PG 核验基础数据存在性:`muse_content_block` id=3、`muse_ai_suggestion` id=3、`muse_member_security_event`「待确认演练」、`muse_market_appeal`/资产、账户/智能体、`muse_knowledge_source_binding_projection`(work_id=1/active/market_kb/kb4001)。② 缺失项写**幂等 upsert** 种子(对齐 global-setup 风格)。③ knowledge-bindings 投影种子补入 global-setup 或 seed-base。**注意**`muse_ai_suggestion.id``GENERATED ALWAYS`suggestion3 若缺需处理 id 对齐global-setup #3 假定其存在不重建)——若无法还原原 id需调整该 spec 的定位策略或基础种子以稳定 id。
- **Test scenarios**:种子幂等(重跑不产生重复/唯一冲突);跑后 global-setup 5 类复位**无 "基础种子缺失" warn**`GET /works/1/knowledge-bindings` 返回 active 绑定。
- **Verification**global-setup 跑无 warn9 spec 的基础前置全部满足。
### U3. 逐 spec 实跑 + 结果记录
- **Goal**playwright 跑全部 9 spec记录每个 pass/fail + 失败根因线索。
- **Requirements**R1、R2。
- **Dependencies**U1、U2。
- **Files**`muse-studio/e2e/{accept-suggestion,knowledge-graph,knowledge-confirm,knowledge-bindings,market-publish,account-security-ack,live-read,agent-create,workspace}.spec.ts``muse-studio/playwright.config.ts`webServer 自动起 vite 5173、`VITE_API_MOCK=false` 已固化)。
- **Approach**`set -a; . infra.env; set +a``cd muse-studio; ./node_modules/.bin/playwright test`。**先单跑 `knowledge-bindings`**(历史从未活体跑、最高风险,验证 PG unblock再全量。global-setup 每轮复位 fixture。记录每 spec 结果(绿/红 + trace
- **Test scenarios**spec 本身即测试。关键断言accept-suggestion 正/负(采纳写 Canonical rev1→2 / 乐观锁拒knowledge-confirmShadow→Canonical 入库 + 草稿 confirmedmarket-publish 6 例(发布草稿/申诉/撤回全链knowledge-bindings投影读回 200/code:0/activelive-read 5 读旅程agent-create / workspace 冒烟。
- **Verification**9 spec 结果明确(绿,或红 + 根因);首次全量真跑结果落账。
### U4. 红用例就地修(条件性)
- **Goal**:跑红的 spec 定位根因(前端断言/接线 or 后端潜伏 bug**就地修**至绿。
- **Requirements**R1、R3、R4。
- **Dependencies**U3。
- **Files**:视红而定——前端 `muse-studio/src/**` 或后端 `muse-cloud/**`(后端改动后回 U1 rebuild jar + 重起栈)。
- **Approach**:红多为"从未活体跑过的潜伏 bug"。前端红=断言/接线/SSE 漂移类;后端红=潜伏业务 bug就地修 + 补 Flyway 迁移/IT如 publish 索引→V22 先例)。
- **Execution note**:修红前先**复现 + 定位根因**,再 targeted 修,**勿掩盖**(反假绿);后端修须配真实 PG IT 或迁移,不靠放宽断言凑绿。
- **Test scenarios**:每修复点回归对应 spec 绿;后端修补对应迁移/IT如适用修复不引入其他 spec 回归(全量复跑)。
- **Verification**:原红 spec 转绿,根因 + 修复有记录;全量无回归。
### U5. 测试结论台账回写
- **Goal**:整理全量 e2e 测试结论(每 spec 状态/证据/修复/无法绿的根因),回写进度总账 + 总览。
- **Requirements**R2。
- **Dependencies**U3、U4
- **Files**`docs/mvp/进度总账.md``docs/项目功能与进度总览.md`
- **Approach**结论表spec × 状态 × 证据 × 修复。更新总览待办e2e「待实跑」→ 实跑结果)、必要时同步 `.agents/knowledge/module-reality-baseline.md`。回写进度总账时间线。**不新增过程文档**。
- **Test scenarios**none —— 纯文档台账回写,无行为变更。
- **Verification**:进度台账反映全量 e2e 真实结果;总览 e2e 行从「待实跑」更新为实跑结论。
---
## Scope Boundaries
- **不在本 plan**studio UI 4 组补全origin 目标 1、admin 管理端 UI、两个未实现硬缺口Meta impact-preview、AI Security 权限链)。
- **Deferred to Follow-Up Work**P0 = AI 候选采纳链 UI 补全(见 origin——本 plan 的全量 e2e 跑通是其前置基线。
## Risks & Dependencies
- **R-基础数据**:基础种子部分缺失(尤其 suggestion3 `GENERATED ALWAYS` id 难还原)→ U2 核验,可能需调 spec 定位或稳定 id 策略。
- **R-潜伏红**:首次全量真跑暴露潜伏 bugknowledge-bindings 从未活体跑)→ U4 就地修,可能触及后端 + rebuild jar。
- **R-jar 时效**jar 为 Jun-19 buildU4 改后端须 `mvn package` 重 build + 重起栈(耗时)。
- **R-fixture 共享**:多 spec 消费共享 fixturelive-read 多读旅程、market 申诉状态流转)→ global-setup 每轮复位缓解,但顺序敏感用例需注意。
- **R-PG 在线**`100.64.0.8` 依赖 Tailscale 在线(本会话可达,会话间可能再离线)→ 离线即全套阻塞,需 PG 宿主恢复。
- **依赖**:本机 redis、`muse-server.jar`、playwright chromium已装`infra.env` 凭据(仓外)。
## 完成条件Verification
1. 9 个 e2e spec **全绿**,或**诚实记录**无法绿的 spec + 根因(反假绿,不放宽断言凑绿)。
2. 基础种子**可入库、幂等**global-setup 无"基础种子缺失"warn。
3. 红用例根因 + 修复有记录;后端修配真实 IT/迁移。
4. 测试结论**回写进度总账 + 总览**e2e 行从「待实跑」更新为实跑结论。