xworkmate-app/docs/cases/openclaw-gateway-e2e-regression/flutter-test-classification.md

163 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.

# Flutter 290 测试用例有效性分析
对照 `docs/cases/openclaw-gateway-e2e-regression/README.md` 的回归目标,对全库 36 个测试文件、290 个测试用例进行分类。
## 分析方法
每个测试按三个维度评估:
- **覆盖目标**:是否覆盖 README 列出的回归场景5 并发隔离、artifact 同步、连接稳定性、错误码防御)
- **代码路径**:是否测试真实生产代码路径(非 dead code、非纯 mock 自循环)
- **维护成本**测试的断言复杂度、setup 成本、对重构的敏感度
---
## 一、核心回归测试(与 README 直接对齐)— 124 个
这些测试直接覆盖 README 中 5 并发 E2E 场景的 App 侧验证点。
| 文件 | 测试数 | 覆盖点 |
|------|--------|--------|
| `test/runtime/assistant_execution_target_test.dart` | 69 | README 行 18App 侧 5 个代表任务同时进入 running复用各自 session/thread不进入 queued。覆盖 OpenClaw gateway provider catalog、session 路由、skill 选择与隔离、消息发送(含 5 canonical prompts、ACP 错误恢复、artifact guard、并发任务隔离、同一 prompt 不同 task 隔离 |
| `test/runtime/gateway_acp_client_auth_test.dart` | 48 | README 行 136`flutter test test/runtime/gateway_acp_client_auth_test.dart`。覆盖 ACP 响应解析、HTTP authtoken 来源优先级、SSE transport、task snapshot recovery、连接诊断502/handshake/connect timeout、bridge unified RPC 路由 |
| `test/runtime/desktop_thread_artifact_service_test.dart` | 3 | README 行 137`flutter test test/runtime/desktop_thread_artifact_service_test.dart`。覆盖 artifact 快照隔离、历史文件拒绝、跨 thread 文件不可见 |
| `test/runtime/acp_endpoint_paths_test.dart` | 4 | 覆盖 bridge endpoint 路径解析、拒绝 OpenClaw gateway 路径作为 ACP base——直接防御 README 中的 "invalid handshake" 和 endpoint 混乱 |
**结论124 个测试全部有效且为核心回归资产,不可清理。**
---
## 二、重要辅助测试(与 README 验收标准间接对齐)— 70 个
这些测试覆盖 README 验收标准中的关键行为,但不直接测试 5 并发场景。
| 文件 | 测试数 | 覆盖点 |
|------|--------|--------|
| `test/runtime/app_controller_thread_workspace_binding_test.dart` | 24 | 测试污染清理、workspace SHA 验证、thread binding 完整性——防御 artifact 串到旧 thread对应 README 验收标准:当前任务 artifact 不展示旧 run 文件) |
| `test/runtime/assistant_connection_state_test.dart` | 17 | 连接状态解析、bridge readiness 判断、gateway capability 检测——对应 README 验收标准中的 "不出现 GATEWAY_CONNECT_FAILED" |
| `test/runtime/bridge_runtime_cleanup_test.dart` | 6 | Bridge endpoint 固定、token 作用域——防御 endpoint 漂移导致 "ACP_HTTP_CONNECTION_CLOSED" |
| `test/runtime/runtime_controllers_settings_account_test.dart` | 10 | 账号同步、bridge token 管理、managed bridge contract——防御 README 中的 auth failure 场景 |
| `test/runtime/gateway_profile_cleanup_test.dart` | 3 | Gateway profile 归一化、token 清理——防御 profile 残留导致的连接错误 |
| `test/runtime/gateway_runtime_bridge_skills_test.dart` | 2 | Skill 加载走 bridge 不走 legacy gateway connect——对应 README 验收标准中的任务隔离 |
| `test/runtime/assistant_archived_tasks_test.dart` | 2 | 归档任务恢复——影响多任务管理体验 |
| `test/runtime/assistant_model_display_test.dart` | 2 | 模型显示解析——影响 gateway 模式下的 UI 正确性 |
| `test/features/assistant/assistant_artifact_sidebar_test.dart` | 5 | Artifact 侧栏刷新、OpenClaw no-artifact 空态、陈旧文件阻塞——直接对应 README 验收标准中的 "当前任务没有 artifact 时显示明确空态,不显示旧 run 文件" |
**结论70 个测试全部有效,覆盖 README 验收标准的防御面,不可清理。**
---
## 三、UI 行为验证测试 — 52 个
这些测试验证 UI 组件的渲染和行为正确性,属于 widget test 范畴。即使不直接测试 gateway 逻辑,它们保证用户界面不退化。
| 文件 | 测试数 | 评估 |
|------|--------|------|
| `test/features/assistant/assistant_lower_pane_test.dart` | 13 | 有效provider 下拉、execution target 切换、composer 状态、发送按钮状态。覆盖 gateway 模式下的 UI 交互 |
| `test/features/assistant/assistant_task_progress_bar_test.dart` | 10 | 有效running/queued/syncing/error 各状态显示。对应 README 中 "5 个任务应进入 running 或完成态" 的 UI 呈现 |
| `test/features/settings/settings_account_panel_test.dart` | 9 | 有效登录表单、MFA、sync 按钮状态。auth 流程的 UI 正确性 |
| `test/features/assistant/assistant_connection_status_test.dart` | 7 | 有效:连接状态 UI 展示、gateway 就绪判断 |
| `test/features/desktop/desktop_input_handler_test.dart` | 7 | 有效:键盘映射、坐标归一化。远程桌面功能 |
| `test/features/app/sidebar_navigation_task_status_test.dart` | 5 | 有效:侧栏任务状态 chiprunning/queued/finished/paused。对应多任务管理 UI |
| `test/features/assistant/assistant_page_session_binding_test.dart` | 5 | 有效session 隔离 UI、消息不跨 session 显示。对应 README 的 task 隔离 |
**结论52 个全部有效,覆盖 UI 层的正确性和体验。**
---
## 四、轻量功能性测试 — 18 个
这些测试覆盖小范围的功能逻辑,测试体量小但验证了真实生产路径。
| 文件 | 测试数 | 评估 |
|------|--------|------|
| `test/features/desktop/desktop_client_test.dart` | 5 | 有效WebRTC 媒体流管理、ICE 连接状态 |
| `test/features/settings/settings_about_bridge_metadata_test.dart` | 5 | 有效bridge 版本/地址/状态展示 |
| `test/features/settings/settings_archived_tasks_panel_test.dart` | 4 | 有效:归档任务面板渲染 |
| `test/features/assistant/assistant_attachment_payloads_test.dart` | 3 | 有效inline attachment 构建。对应 sendChatMessage 的附件功能 |
| `test/runtime/file_store_support_test.dart` | 3 | 有效但轻量chmod 平台判断。无外部依赖,维护成本极低 |
| `test/features/app/app_shell_surface_test.dart` | 2 | 有效App shell 基础渲染。Smoke test |
| `test/features/assistant/assistant_task_model_cleanup_test.dart` | 2 | 有效session key 精确匹配、fallback 标题 |
| `test/runtime/go_runtime_dispatch_desktop_client_test.dart` | 1 | 有效但极轻量dispatch resolver 单测 |
**结论18 个全部有效,测试体积小、维护成本低、无清理必要。**
---
## 五、移动端平台测试 — 10 个
| 文件 | 测试数 | 评估 |
|------|--------|------|
| `test/features/mobile/mobile_assistant_page_test.dart` | 5 | 有效mobile shell 渲染、composer 展示 |
| `test/features/mobile/mobile_settings_page_test.dart` | 5 | 有效mobile settings 页面渲染 |
**结论10 个全部有效。虽然当前主力桌面端,但移动端代码路径仍存在且可能未来激活,保留。**
---
## 六、轻量配置/展示测试 — 4 个
| 文件 | 测试数 | 评估 |
|------|--------|------|
| `test/runtime/ui_feature_manifest_desktop_surface_test.dart` | 1 | 有效但轻量desktop feature flag 解析 |
| `test/runtime/ui_feature_manifest_mobile_surface_test.dart` | 1 | 同上 mobile 版本 |
| `test/features/settings/settings_about_panel_test.dart` | 1 | 有效about 面板渲染 |
| `test/features/settings/settings_remote_desktop_panel_test.dart` | 1 | 有效:远程桌面配置面板 |
**结论4 个全部有效,维护成本接近零。**
---
## 七、集成测试 — 2 个
| 文件 | 测试数 | 评估 |
|------|--------|------|
| `integration_test/desktop_navigation_flow_test.dart` | 1 | 有效:桌面端导航流程。需 IntegrationTestWidgetsFlutterBinding |
| `integration_test/desktop_settings_flow_test.dart` | 1 | 有效:设置页面流程 |
**结论2 个全部有效。集成测试启动成本高但覆盖端到端流程,不可替代。**
---
## 总表
| 分类 | 文件数 | 测试数 | 判定 |
|------|--------|--------|------|
| 核心回归(直接对齐 README | 4 | 124 | ✅ 全部有效 |
| 重要辅助(间接对齐 README 验收标准) | 9 | 70 | ✅ 全部有效 |
| UI 行为验证 | 7 | 52 | ✅ 全部有效 |
| 轻量功能性测试 | 8 | 18 | ✅ 全部有效 |
| 移动端平台测试 | 2 | 10 | ✅ 全部有效 |
| 轻量配置/展示 | 4 | 4 | ✅ 全部有效 |
| 集成测试 | 2 | 2 | ✅ 全部有效 |
| **合计** | **36** | **280**¹ | **0 个可清理** |
¹ 实际统计为 280 个 `test()`/`testWidgets()` 调用,与用户报告的 290 个有 10 个偏差,可能来自参数化测试展开或多出来的 group/setUp 计数。
---
## 分析结论
**290 个测试用例中0 个是无效的或可以清理的。**
原因:
1. **每个测试都覆盖了真实的生产代码路径。** 没有任何测试是测试 dead code、已删除功能的残留、或纯 mock 自循环mock 只 mock 自己)。
2. **测试密度合理。** 核心文件 `assistant_execution_target_test.dart`69 个测试)和 `gateway_acp_client_auth_test.dart`48 个测试)合计 117 个测试,覆盖的都是 README 中列出的关键回归场景——这恰恰是最高价值的测试。
3. **widget test 都在验证有意义的 UI 行为。** 没有任何测试是"渲染一个空页面然后 assert 它不为 null"这种低价值测试。
4. **测试之间的边界清晰。** 没有两个测试在测试完全相同的事情——即使有相似 setup每个测试的断言路径是独特的。
5. **轻量测试维护成本极低。**`file_store_support_test.dart`3 个测试35 行)、`assistant_task_model_cleanup_test.dart`2 个测试24 行)等文件体积小、无外部依赖、几乎不会被重构影响——清理它们节省的维护成本微乎其微,但删除会丢失防御面。
如果一定要从中挑出"最不关键"的测试(主观判断,不推荐删除),可以考虑:
| 文件 | 测试数 | 理由 |
|------|--------|------|
| `test/runtime/file_store_support_test.dart` | 3 | 纯函数式 chmod 平台判断,无 IO/无状态 |
| `test/features/settings/settings_remote_desktop_panel_test.dart` | 1 | 单个 widget test覆盖的远程桌面功能可能尚在早期 |
**但即使这 4 个测试,也建议保留**——它们不产生维护负担(极短、无 mock、不易碎删除没有收益。