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

10 KiB
Raw Permalink Blame History

test: 全量 e2e 真跑通 + 测试结论台账


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 READYStarted in 19.437s48080

最大不确定性有二:① 基础种子完整性——global-setup.ts 每轮自动复位 5 类 fixture但假定基础数据已存在基础数据历史靠一次性 /tmp/*.java每会话丢失knowledge-bindings 投影 global-setup 未覆盖。② 首次全量真跑可能暴露潜伏红——部分 spec如 knowledge-bindings从未活体运行过。

Requirementstrace origin

  • R1origin 目标 29 个 e2e spec 全部真实跑通(绿)。
  • R2origin 目标 3测试结论台账——每 spec 状态/证据/修复,回写进度总账。
  • R3origin 完成标准):端到端 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_live100.64.0.8:5433,凭据走 env~/.config/muse-repo/infra.env绝不入库
  5. 结论回写进度总账 + 总览,不新增过程文档(单一台账偏好)。

Implementation Units

U1. 全栈起栈就绪(前置)

  • Goalmuse-server 单体在 48080 起栈,连 muse_slice_live + 本机 redisAI 调度熄火、socks proxy 清除。
  • RequirementsR3。
  • 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 packageclassifier=exec 已配)后重起。本会话已起栈 READY可直接复用。
  • Test scenariosCovers 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=5code:0;日志含 Started MuseServerApplication
  • Verification48080 健康返回 code:0redis PONGPG 直连可达。

U2. 基础种子核验 + 固化为可入库脚本

  • Goal:核验 muse_slice_live 的 e2e 基础数据完整性,缺失项固化为可入库基础种子,补 global-setup 未覆盖的 knowledge-bindings 绑定投影。
  • RequirementsR1、R4。
  • DependenciesU1。
  • Filesmuse-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.idGENERATED ALWAYSsuggestion3 若缺需处理 id 对齐global-setup #3 假定其存在不重建)——若无法还原原 id需调整该 spec 的定位策略或基础种子以稳定 id。
  • Test scenarios:种子幂等(重跑不产生重复/唯一冲突);跑后 global-setup 5 类复位无 "基础种子缺失" warnGET /works/1/knowledge-bindings 返回 active 绑定。
  • Verificationglobal-setup 跑无 warn9 spec 的基础前置全部满足。

U3. 逐 spec 实跑 + 结果记录

  • Goalplaywright 跑全部 9 spec记录每个 pass/fail + 失败根因线索。
  • RequirementsR1、R2。
  • DependenciesU1、U2。
  • Filesmuse-studio/e2e/{accept-suggestion,knowledge-graph,knowledge-confirm,knowledge-bindings,market-publish,account-security-ack,live-read,agent-create,workspace}.spec.tsmuse-studio/playwright.config.tswebServer 自动起 vite 5173、VITE_API_MOCK=false 已固化)。
  • Approachset -a; . infra.env; set +acd muse-studio; ./node_modules/.bin/playwright test先单跑 knowledge-bindings(历史从未活体跑、最高风险,验证 PG unblock再全量。global-setup 每轮复位 fixture。记录每 spec 结果(绿/红 + trace
  • Test scenariosspec 本身即测试。关键断言accept-suggestion 正/负(采纳写 Canonical rev1→2 / 乐观锁拒knowledge-confirmShadow→Canonical 入库 + 草稿 confirmedmarket-publish 6 例(发布草稿/申诉/撤回全链knowledge-bindings投影读回 200/code:0/activelive-read 5 读旅程agent-create / workspace 冒烟。
  • Verification9 spec 结果明确(绿,或红 + 根因);首次全量真跑结果落账。

U4. 红用例就地修(条件性)

  • Goal:跑红的 spec 定位根因(前端断言/接线 or 后端潜伏 bug就地修至绿。
  • RequirementsR1、R3、R4。
  • DependenciesU3。
  • 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 状态/证据/修复/无法绿的根因),回写进度总账 + 总览。
  • RequirementsR2。
  • DependenciesU3、U4
  • Filesdocs/mvp/进度总账.mddocs/项目功能与进度总览.md
  • Approach结论表spec × 状态 × 证据 × 修复。更新总览待办e2e「待实跑」→ 实跑结果)、必要时同步 .agents/knowledge/module-reality-baseline.md。回写进度总账时间线。不新增过程文档
  • Test scenariosnone —— 纯文档台账回写,无行为变更。
  • Verification:进度台账反映全量 e2e 真实结果;总览 e2e 行从「待实跑」更新为实跑结论。

Scope Boundaries

  • 不在本 planstudio UI 4 组补全origin 目标 1、admin 管理端 UI、两个未实现硬缺口Meta impact-preview、AI Security 权限链)。
  • Deferred to Follow-Up WorkP0 = 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 行从「待实跑」更新为实跑结论。