Skip to content

✅ 补全并重构高价值 E2E 覆盖#1629

Merged
CodFrm merged 5 commits into
mainfrom
test/e2e-storage-name
Jul 21, 2026
Merged

✅ 补全并重构高价值 E2E 覆盖#1629
CodFrm merged 5 commits into
mainfrom
test/e2e-storage-name

Conversation

@CodFrm

@CodFrm CodFrm commented Jul 21, 2026

Copy link
Copy Markdown
Member

Checklist / 检查清单

  • Fixes mentioned issues / 修复已提及的问题
  • Code reviewed by human / 代码通过人工检查
  • Changes tested / 已完成测试

N/A — 本 PR 没有关联 Issue;目标是精简重复 smoke,并补齐只有真实扩展、浏览器 API 和跨上下文才能证明的高价值 E2E。

背景

原有 E2E 中存在多组“页面可见 / 按钮可用”的重复 smoke,但安装、更新、备份恢复、订阅和 @early-start 等核心链路没有在真实浏览器中形成可观察的闭环。example/gm_value 中的跨脚本共享、前后台运行环境也缺少正反契约。

新增的高价值 E2E

@storageName 共享、隔离与生命周期

  1. 不同 UUID、相同 @storageName 的普通脚本交叉验证 GM_setValue / GM.setValueGM_getValue / GM.getValue,并断言跨脚本 listener 的 remote === true
  2. @background 脚本与页面脚本跨 Offscreen/Sandbox 和页面注入环境双向传值,两端 listener 均报告 remote === true
  3. 不同 @storageName 使用相同 key 时严格隔离。
  4. 仅剩回收站 owner 时 purge 另一 owner,恢复脚本后共享值仍然存在。
  5. 最后 owner 被 purge 后重新安装脚本,不得读到已清理的旧值。

安装与更新

  • 从真实 install.html?url= 加载 v1,点击安装后在匹配页面断言 v1 脚本实际执行。
  • 同一来源提供 v2,安装页展示 old/new version,点击更新后新页面只执行 v2。

备份真正 round-trip

  • 安装脚本并写入 GM Value,导出备份 ZIP。
  • 导入前彻底删除原脚本及其 Value,排除“只解析预览也会假绿”。
  • 真正点击 Import 并等待 import-complete,再在匹配页面断言脚本重新执行且 GM Value 已恢复。

订阅完整生命周期

  • v1 订阅安装 A/B,匹配页面证明两个关联脚本实际执行。
  • v2 新增 C,断言 A/B/C 均执行;v3 移除 B,断言仅 A/C 执行。
  • 从订阅 UI 删除订阅,断言关联脚本 A/C 不再注入。
  • 使用本地 HTTP server 供应订阅与子脚本,不依赖公网或 Service Worker 请求拦截时序。

@early-start + CSP + world

  • example/tests/early_inject_page_test.jsearly_inject_content_test.js 接入正式 E2E。
  • 两者均在本地 script-src 'none' CSP 页面运行,分别验证 page world / content world 的 parser 早期注入和 GM API 桥接。
  • 保留独立 CSP probe,先证明页面内联脚本确实被拦截,避免 fixture CSP 失效时的假绿。

重复 E2E 精简

  • standalone-pages-smoke.spec.ts 删除已被专属 spec 覆盖的 Options、Popup、Install smoke,仅保留 Import 缺缓存、Batch Update 空态、Confirm 过期态。
  • script-editor.spec.ts 删除 Monaco 可见、模板可见和保存成功的层层子集,保留保存后脚本进入列表的最强用例。
  • agent-navigation.spec.ts 只保留真实侧边栏点击导航,删除已被 Agent 专属 spec / 全路由 smoke 覆盖的直达与空态。
  • 删除 settings.spec.ts 的容器可见和“任意控件数 > 0”两个低判别力用例;Settings 路由挂载仍由 options-pages-smoke.spec.ts 覆盖。
  • 删除 XHR @connect 基本成功 GET 的重复 case,将 ok / method 断言并入更强的真实 header + DNR marker 场景。

实现原则

  • 断言用户可观察结果:匹配页脚本执行、GM Value 恢复、订阅脚本增删、listener remote 语义;不以 DAO / IndexedDB 内部状态代替最终结果。
  • 网络全部使用 Playwright route 或本地 HTTP server,无公网依赖。
  • 使用随机 storageName / key / namespace 和隔离 profile;使用 Playwright assertion / expect.poll,不用固定 sleep 掩盖异步时序。

验证

  • pnpm exec eslint <changed-e2e-files> — 通过
  • pnpm run typecheck — 通过
  • pnpm run build — 通过(仅现有 bundle size / dynamic require 性能警告)
  • CI=1 pnpm exec playwright test e2e/storage-name.spec.ts --workers=1 --repeat-each=2 — 10 passed
  • CI=1 pnpm exec playwright test e2e/install.spec.ts e2e/backup-zip.spec.ts e2e/subscribe-lifecycle.spec.ts --workers=1 --repeat-each=2 — 6 passed
  • CI=1 pnpm exec playwright test e2e/agent-navigation.spec.ts e2e/script-editor.spec.ts e2e/standalone-pages-smoke.spec.ts e2e/backup-zip.spec.ts e2e/install.spec.ts e2e/subscribe-lifecycle.spec.ts e2e/gm-xhr-site-access.spec.ts --workers=1 — 11 passed
  • CI=1 pnpm exec playwright test e2e/gm-api.spec.ts --workers=1 --grep 'local CSP target|GM_ sync API tests|@early-start' — 4 passed;gm_api_sync_test.js 29 passed / 0 failed

Screenshots / 截图

N/A — 纯 E2E 测试改动,无视觉界面变化。

@CodFrm CodFrm changed the title ✅ add @storageName shared storage E2E tests ✅ 补全并重构 @storageName 高价值 E2E 覆盖 Jul 21, 2026
@CodFrm CodFrm changed the title ✅ 补全并重构 @storageName 高价值 E2E 覆盖 ✅ 补全并重构高价值 E2E 覆盖 Jul 21, 2026
@cyfung1031

Copy link
Copy Markdown
Collaborator

e2e 盡量以integrated test 為測試對象吧
像xhr 那些一個操作就能測試多個東西。
整合了後應該都是用代表性高的e2e 測messaging 加一些UI UX 操作互動測試

我沒什麼意見,能跑就好

@CodFrm
CodFrm merged commit 301c13e into main Jul 21, 2026
9 of 10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants