Skip to content

fix: 隔离跨测试全局状态并等待异步清理 - #260

Open
tanbro wants to merge 3 commits into
HuangPuStar:mainfrom
tanbro:fix/test-state-isolation
Open

tanbro wants to merge 3 commits into
HuangPuStar:mainfrom
tanbro:fix/test-state-isolation

Conversation

@tanbro

@tanbro tanbro commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

背景

后端与前端测试在同一 Bun 进程内运行,部分既有测试会修改进程级 singleton、异步启动 cleanup,或直接覆盖 repository class instance 方法。测试文件顺序变化后,这些状态可能进入下一文件,造成单文件通过、全量随机失败:

  • Hermes 状态测试读到前序测试留下的 ws://second.invalid/ws
  • ACP machine close 的动态 import 在 teardown 后继续执行;
  • knowledge repository 测试把前序 service mock 当成真实实现;
  • 前端 SSR 捕获了另一文件将 I18nextProvider 包装为 <div> 的 module mock。

本 PR 修复状态所有权与完成边界,不通过固定测试顺序或放宽断言规避问题。

与 PR #259 的关系

本 PR 是 #259(App Builder)的前置稳定性修复,自身不包含 App Builder 实现。

#259 增加测试文件后改变了 fresh checkout 中未排序文件列表的枚举结果,从而暴露上述 main 既有状态泄漏;这些失败不由 App Builder 的 Runtime、Profile 或 route 装配引起。为保持 #259 的评审边界清晰,相关修复从该分支独立出来。

合并顺序:

  1. 先将本 PR 合并到 main
  2. 再让 feat/app-builder-foundation 同步最新 main
  3. 仅在 feat: 引入 App Builder 应用装配与生命周期运行时 #259 中补充 App Builder disposer 对正式 Hermes 停止接口的接入,并重新执行其完整验证。

主要变更

  • 新增正式的 stopHermesClient():停止资源时解除仍属于目标实例的 singleton 引用;释放旧实例不会误清后来替换的新实例。
  • 将 ACP machine frontend cleanup 收敛为可等待 Promise:
    • WebSocket close 的直接调用方等待完整清理;
    • Elysia callback 和 sweep 等 fire-and-forget 边界显式记录失败;
    • 保留用于打破循环依赖的 dynamic import。
  • 新增 knowledge repository 测试状态恢复工具:只删除测试写入且遮蔽 class prototype 方法的 own property,不再保存可能已被污染的顶层 originals 快照。
  • 删除 workflow-params-outputs-flow 中重复的 react-i18next module mock,复用统一 preload seam。
  • 清理 main 上现有的 4 条 Biome warning,不改变运行行为。

边界

  • 不修改 HTTP、WebSocket、ACP 或 Hermes 协议。
  • 不修改数据库 schema、migration、依赖版本或 lockfile。
  • 不创建第二套 relay/controller 实现。
  • production 变更仅补齐 Hermes 与 ACP 的资源释放语义;knowledge/frontend 改动只涉及测试隔离。

验证

本机默认 Bun 1.4.2:

  • 固定四组原失败顺序:全部通过
  • backend:3717 pass / 0 fail
  • packages:2474 pass / 2 skip / 0 fail
  • frontend:2261 pass / 0 fail
  • bun run build:web:通过
  • bun install --frozen-lockfile:通过,no changes
  • bun run lint:通过,0 warning
  • bun run precheck:8212 pass / 0 fail,全部步骤通过

CI 固定 Bun 1.3.14:

  • 固定四组原失败顺序:全部通过
  • backend:3717 pass / 0 fail
  • packages:2474 pass / 2 skip / 0 fail
  • frontend:2261 pass / 0 fail
  • bun run precheck:8212 pass / 0 fail,全部步骤通过

🤖 Generated with Claude Code

liu xue yan and others added 3 commits September 6, 2026 14:07
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@tanbro
tanbro marked this pull request as draft September 7, 2026 01:03
@tanbro
tanbro marked this pull request as ready for review September 7, 2026 01:14
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.

1 participant