v0.5.26 E2E 测试复盘

2026-06-27 | 执行者:Claude Code (Opus)

流程踩坑

1. dev 镜像未等 CI 完成就发了 release

发生了什么:打了 dev tag 后没等 CI 构建完成,直接用源码测试、直接 release。结果 dev CI 实际失败了(cartopy 编译 OOM),完全跳过了"用 CI 产物测试"这一步。

根因:fullstack-test skill 里没有写"等 dev CI 完成 → 拉镜像 → 用镜像跑测试"这个环节。测试计划 HTML 里写了阶段二,但执行时图快跳过了。

改进:fullstack-test skill 应增加硬性门禁:gh run watch 等 dev CI 完成 → docker pull 拉镜像 → 用镜像而非源码跑全流程。release CI 恰好成功是运气(分架构构建避开了 OOM)。

2. dev CI 因 cartopy 编译 OOM 失败

发生了什么:app-image-develop workflow 在同时构建 amd64+arm64 时,cartopy 的 Cython C++ 文件(41000+ 行)编译耗尽 runner 内存,fatal error: error writing to

根因:dev workflow 用 QEMU 模拟 + 并行双架构构建,资源竞争严重。release workflow 分开成两个独立 job,每个 job 只构建一个架构,所以成功了。

改进:app-image-develop.yml 也应改为分架构独立 job(与 release 一致),或者 dev 只构建 amd64 单架构(盒子主要是 x86)。提 issue 记录。

3. v0.5.25 tag 已被旧 commit 占用

发生了什么:v0.5.25 tag 指向 76a2977f(旧 commit),测试的是 778eff4c(新 commit)。Codex review 时发现了这个问题,改发 v0.5.26。

改进:发版前先跑 git tag -l 'v*' --sort=-v:refname | head -1 确认最新 tag,版本号自动 +1。可以写进 fullstack-test skill。

工具踩坑

4. Chrome 自动化输入中文到 contenteditable 失败

发生了什么:Claude in Chrome 的 type 动作对用户 1 能正常输入中文(首次),但切换到用户 2 后 type 的内容"消失"了。form_input 不支持 DIV 元素。用 document.execCommand('insertText') 能写入 DOM 但 React/Tiptap 状态不同步,发送按钮无效。

根因:Tiptap/ProseMirror 的 contenteditable 由编辑器内部状态管理,直接操作 DOM 不会更新 React state。type 动作依赖操作系统 IME,刷新页面后 IME 状态可能变化。

改进:对 Tiptap 编辑器输入应使用 execCommand('insertText', false, text)(适用于英文),或通过 React fiber 找到 Tiptap editor 实例调用 editor.commands.insertContent()。可以封装为浏览器测试的通用 helper。

5. Mock 登出重定向到不存在的 OAuth server

发生了什么:点击登出按钮后,页面重定向到 localhost:19000/logout(真实 OAuth server 地址),但 mock 模式下 19000 端口没有服务。

改进(产品):Mock 模式下的登出应该直接清除 cookie 并重定向到 BA 自己的登录页(/api/auth/login),而不是跳到不存在的 OAuth server。这是一个产品 bug,应提 issue。

6. Box Deploy render-only 在 macOS 上多处失败

发生了什么:chown root 失败、/output 只读文件系统、chgrp 找不到用户组。需要大量 -e 覆盖才能部分跑通。

改进:box-deploy 的 render-only 应该能在 macOS 上零配置运行。建议:(1) render-only 模式自动跳过 chown/chgrp;(2) 提供 inventory.macos-local.yml 模板,预设 ansible_become=false + 用 $HOME/tmp 作为 deploy root。

Skill 改进建议

fullstack-test skill 增加"镜像测试"阶段

当前 skill 只覆盖"源码启动 → 浏览器测试"。应增加:

  1. 打 dev tag + 等 CI 完成(gh run watch
  2. 拉取 dev 镜像 + 用 docker run 启动 BA(替代 uvicorn 源码启动)
  3. 用镜像跑同一套测试
  4. 确认通过后才允许 release

fullstack-test skill 增加 BO OAuth 集成指南

当前 skill 只描述 Mock 模式。应增加"真实 OAuth 模式"章节:

  1. 启动 BO v0.4.2 + 注册 application(需要 bootstrap token)
  2. 配置 BA 的 oauth_config.yaml 指向 BO
  3. 创建测试用户
  4. 验证 OAuth 登录流程

新增 release skill

把发版流程固化为 skill,包含:

  1. 自动计算下一个版本号(读最新 tag + patch +1)
  2. 检查 dev tag CI 是否通过
  3. 生成 release notes(从 PR 列表自动汇总)
  4. 创建 GitHub Release
  5. 等 release CI 完成并确认镜像推送成功
  6. 更新 box-deploy 的 defaults/main.yml 镜像 tag

Mock 双用户配置应该有默认模板

测试用户隔离需要双用户 mock 配置,但默认的 oauth_config.mock.yaml 只有单用户。应提供 oauth_config.mock-multiuser.yaml 模板,或者在 mock.yaml 注释中说明如何配置双用户。

发现的产品问题(非阻塞)

#问题严重度建议
1 Mock 模式登出跳转到不存在的 19000 端口 Mock 下登出应清 cookie + 跳自己的 /api/auth/login
2 项目列表卡片点击无法进入项目详情 需要点击项目名称文字而非卡片任意区域,体验不一致
3 dev CI (app-image-develop) 双架构并行构建 OOM 改为分架构独立 job 或仅构建 amd64

效率观察

API 测试远比浏览器点击高效

浏览器自动化一个测试项需要 5-10 轮对话(截图→点击→等待→截图),API 测试一个 curl 命令就能验证。建议 E2E 测试以 API 验证为主,浏览器只用于关键 UI 交互和截图证据。

GIF 录制有价值但帧数有限

GIF 最多 50 帧,长流程会被截断。对于需要等待智能体回复的测试(10+ 秒等待),GIF 帧大部分是等待画面。建议只对关键交互录制 GIF,其他用单张截图 + API 日志佐证。

全家桶环境搭建耗时过长

Gitea admin 创建 → BO 应用注册 → SR 连接 → Blade OS 配置,手动搭一次要 20+ 分钟。应该有一个 docker-compose.fullstack.yml 一键启动全家桶测试环境。