Files
zclaw_openfang/docs/superpowers/specs/2026-04-22-feature-chain-exhaustive-test-design.md
iven fa5ab4e161
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
refactor(middleware): 移除数据脱敏中间件及相关代码
移除不再使用的数据脱敏功能,包括:
1. 删除data_masking模块
2. 清理loop_runner中的unmask逻辑
3. 移除前端saas-relay-client.ts中的mask/unmask实现
4. 更新中间件层数从15层降为14层
5. 同步更新相关文档(CLAUDE.md、TRUTH.md、wiki等)

此次变更简化了系统架构,移除了不再需要的敏感数据处理逻辑。所有相关测试证据和截图已归档。
2026-04-22 19:19:07 +08:00

651 lines
32 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.

# ZCLAW 功能链路穷尽测试方案
> **方案**: B+C 混合 — 状态机转换测试(主体)+ 3 角色冒烟测试(补充)
> **范围**: 33 条功能链路345 个测试场景,分 5 批执行
> **执行方式**: 通过 Tauri MCP 模拟真实用户操作(找碴模式)
## Context
基于 wiki/feature-map.md 的 33 条功能链路,设计穷尽测试。目标不是"页面能打开就算通过",而是验证完整数据流、边界条件、错误恢复、降级机制、跨链路交互。通过 Tauri MCP 工具query_page/click/type_text/execute_js/take_screenshot/wait_for执行。
## 状态模型12 核心状态)
```
FRESH → CONFIGURED → CONNECTED_LOCAL
↓ ↓
LOGGED_OUT → LOGGED_IN → CONNECTED_SAAS
↓ ↓
TOKEN_EXPIRED DEGRADED
↓ ↓
LOGGED_IN ←───────┘
CHATTING → STREAM_COMPLETE
附加: ADMIN_MODE / BUTLER_SIMPLE / BUTLER_PRO / PIPELINE_RUN
```
| 状态 | 验证方式 |
|------|----------|
| FRESH | `!connectionStore.connectionState` |
| CONNECTED_LOCAL | `connectionState === 'connected' && mode === 'tauri'` |
| LOGGED_IN | `saasStore.token && !saasDegraded` |
| CONNECTED_SAAS | `connectionState === 'connected' && mode === 'saas'` |
| DEGRADED | `saasStore.saasReachable === false` |
| CHATTING | `streamStore.isStreaming === true` |
| STREAM_COMPLETE | `streamStore.isStreaming === false && lastMessage.role === 'assistant'` |
---
## Batch 1核心聊天F-01~F-0552 场景)
### F-01 发送消息11 场景)
| ID | 类别 | 场景 | From → To | 验证点 |
|----|------|------|-----------|--------|
| F01-01 | normal | 发送简单中文"你好" | CONNECTED → CHATTING → COMPLETE | 用户气泡出现、AI 流式响应、streaming 动画、完成状态 |
| F01-02 | normal | 发送英文长消息500字 | CONNECTED → COMPLETE | 完整接收不截断、token 计数更新 |
| F01-03 | normal | 发送含代码请求 | CONNECTED → COMPLETE | AI 返回代码块、语法高亮正确 |
| F01-04 | boundary | 空消息 | CONNECTED → CONNECTED | 发送按钮禁用/无反应 |
| F01-05 | boundary | 连续快速发送 5 条 | CHATTING → CHATTING | 排队机制正常/提示等待/不丢消息 |
| F01-06 | boundary | 超长消息10000字 | CONNECTED → COMPLETE | 不崩溃/不截断或合理提示 |
| F01-07 | error | 网络中断后发送 | CONNECTED → ERROR → CONNECTED | 错误提示友好、不丢失用户输入、可重试 |
| F01-08 | error | 模型不可用 | CONNECTED → ERROR → CONNECTED | 400 错误提示明确、自动建议可用模型 |
| F01-09 | degradation | SaaS 不可达降级 | SAAS → DEGRADED → LOCAL | 自动降级到本地、提示降级状态 |
| F01-10 | cross | 发送中切换 Agent | CHATTING → COMPLETE → 切换 | 当前流正常完成/新 Agent 独立会话 |
| F01-11 | cross | 发送后检查记忆触发 | COMPLETE → MEMORY | Memory 中间件触发提取、记忆统计增加 |
### F-02 流式响应10 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F02-01 | normal | 正常流式逐字显示 | 文字逐字出现、光标闪烁、最后停止 |
| F02-02 | normal | Thinking 模式展示 | thinking 内容折叠、思考→回答分离 |
| F02-03 | normal | 工具调用流式展示 | ToolStart/ToolEnd 事件正确渲染 |
| F02-04 | normal | Hand 触发流式展示 | HandStart/HandEnd 事件、进度指示 |
| F02-05 | boundary | 极短响应(<5字 | 短响应不吞字完整显示 |
| F02-06 | boundary | 超长响应>5000字 | 不截断、不重复、滚动正常 |
| F02-07 | boundary | 中英日韩混合内容 | Unicode 正确渲染、不乱码 |
| F02-08 | error | 流式中途 500 错误 | 错误提示友好、部分内容保留 |
| F02-09 | error | 流式中途超时 | 超时守护触发5min、提示超时、可重试 |
| F02-10 | cross | 流式中取消再重新发送 | 新流正常开始、不受旧流影响 |
### F-03 模型切换10 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F03-01 | normal | 切换到另一个模型 | 模型名更新、下次消息用新模型 |
| F03-02 | normal | 切换后发送验证 | 确认使用新模型响应 |
| F03-03 | normal | 列出所有可用模型 | SaaS 白名单模型完整列表 |
| F03-04 | boundary | 快速切换 10 次 | 最后一次生效、不崩溃 |
| F03-05 | boundary | 无可用模型 | 清空 Provider Key → 模型列表为空、友好提示 |
| F03-06 | error | 切换到未启用模型 | SaaS 返回 400、提示错误 |
| F03-07 | error | 模型别名不匹配 | 用非精确 ID → 400、提示精确 ID |
| F03-08 | degradation | SaaS 不可达时切换 | 降级模式下使用本地模型列表 |
| F03-09 | cross | 切换模型+发消息+检查 token | token 计数正确归属新模型 |
| F03-10 | cross | 会话中切换模型不丢上下文 | 3轮→切换→再聊→上下文保留 |
### F-04 上下文管理11 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F04-01 | normal | 单会话上下文连续5轮 | AI 记得前文、不丢上下文 |
| F04-02 | normal | 切换回来恢复会话 | 切走→切回→消息历史完整 |
| F04-03 | normal | 跨会话持久化 | 发消息→关闭→重开→IndexedDB 保留 |
| F04-04 | boundary | 超长上下文50轮 | Compaction 触发、不崩溃 |
| F04-05 | boundary | 上下文窗口满 | 自动压缩、保留关键信息 |
| F04-06 | error | 消息存储失败 | IndexedDB 空间满→优雅降级、不丢对话 |
| F04-07 | cross | 多 Agent 会话隔离 | Agent A 聊 X → Agent B 聊 Y → 回到 A → 不混 |
| F04-08 | cross | 会话标题自动生成 | 新会话聊 2 轮→Title 中间件生成标题 |
| F04-09 | cross | 记忆注入影响上下文 | 有历史记忆→新会话→system prompt 含相关记忆 |
| F04-10 | cross | 大上下文+模型切换 | 20轮后切换模型→上下文完整 |
| F04-11 | cross | 跨会话记忆检索增强 | 昨天聊 X→今天问 X→IdentityRecall 检索到 |
### F-05 取消流式10 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F05-01 | normal | 流式中点击取消 | 流立即停止、已接收内容保留 |
| F05-02 | normal | 取消后发新消息 | 新消息正常发送、不受旧流影响 |
| F05-03 | normal | 取消后消息标记 | 消息标记为"已取消"/不完整状态 |
| F05-04 | boundary | 流刚完成时取消 | 无副作用、消息完整 |
| F05-05 | boundary | 连续取消 3 次 | 每次取消立即生效、不卡死 |
| F05-06 | boundary | 取消正在 tool call 的流 | 工具执行正确中断、状态清理 |
| F05-07 | error | 取消失败(网络已断) | 不崩溃、超时后自动清理 |
| F05-08 | cross | 取消+Token 统计 | 已消耗 token 正确计入 |
| F05-09 | cross | 取消+记忆提取 | 已接收部分可能触发提取 |
| F05-10 | cross | 取消+上下文保留 | 新消息引用已接收内容→AI 知道 |
---
## Batch 2Agent + 认证F-06~F-09, F-17~F-1972 场景)
### F-06 创建 Agent10 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F06-01 | normal | 正常创建 Agent | 侧边栏出现新 Agent、可选中 |
| F06-02 | normal | 自定义名称+模型+提示 | 配置正确保存、生效 |
| F06-03 | boundary | 重复名称 | 允许或提示冲突、不崩溃 |
| F06-04 | boundary | 超长名称100字 | 正确处理、截断或提示 |
| F06-05 | boundary | 特殊字符名称emoji/中文/<> | 不崩溃、显示正确 |
| F06-06 | boundary | 空系统提示 | 使用默认提示、不崩溃 |
| F06-07 | error | 创建失败 | 错误提示、不产生幽灵 Agent |
| F06-08 | cross | 创建后立即发消息 | 新 Agent 独立会话、响应正常 |
| F06-09 | cross | 创建+记忆隔离 | 新 Agent 记忆统计为 0 |
| F06-10 | cross | 创建后列表刷新 | 侧边栏排序/数量正确 |
### F-07 切换 Agent10 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F07-01 | normal | 正常切换 | Agent 选中、会话切换 |
| F07-02 | normal | 切换后发消息 | 使用新 Agent 的配置 |
| F07-03 | normal | 切换后上下文独立 | 不混入其他 Agent 的对话 |
| F07-04 | boundary | 快速连续切换 10 次 | 最后一次生效、不崩溃 |
| F07-05 | boundary | 切到刚创建的 Agent | 空会话、正常使用 |
| F07-06 | boundary | 切回默认 Agent | 原有会话恢复 |
| F07-07 | boundary | 仅 1 个 Agent 时 | 无切换选项或自身 |
| F07-08 | cross | 流式中切换 | 当前流完成/新 Agent 独立 |
| F07-09 | cross | 不同模型 Agent | 各用各的模型 |
| F07-10 | cross | 记忆不混淆 | Agent A 记忆不出现在 B |
### F-08 配置 Agent10 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F08-01 | normal | 改名称 | 侧边栏+详情同步更新 |
| F08-02 | normal | 改模型 | 下次消息用新模型 |
| F08-03 | normal | 改系统提示 | AI 行为改变 |
| F08-04 | boundary | 空名称 | 校验提示、不允许保存 |
| F08-05 | boundary | 超长系统提示5000字 | 正确保存或提示限制 |
| F08-06 | boundary | 特殊字符提示 | 不注入/不崩溃 |
| F08-07 | error | 保存失败 | 不丢原配置、提示重试 |
| F08-08 | cross | 配置后立即生效 | 不需重启/下条消息生效 |
| F08-09 | cross | 已有对话不受影响 | 历史消息不变 |
| F08-10 | cross | 配置+记忆联动 | 改系统提示不影响已有记忆 |
### F-09 删除 Agent10 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F09-01 | normal | 正常删除 | 确认弹窗→删除→列表更新 |
| F09-02 | normal | 删除当前 Agent | 自动切换到默认 |
| F09-03 | normal | 删除有对话的 Agent | 级联删除 sessions/messages |
| F09-04 | boundary | 取消删除 | 弹窗取消→无变化 |
| F09-05 | boundary | 删除最后一个(仅默认) | 不允许删除或保护 |
| F09-06 | error | 删除失败 | 提示错误、Agent 仍存在 |
| F09-07 | cross | 删除后记忆级联 | Agent 记忆一同清除 |
| F09-08 | cross | 删除使用中的 Agent | 正确处理、不崩溃 |
| F09-09 | cross | 批量删除 3 个 | 逐个确认或批量确认 |
| F09-10 | cross | 删除后切换到默认 | 会话为空、正常可用 |
### F-17 注册10 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F17-01 | normal | 正常注册 | 成功→自动登录→进入聊天 |
| F17-02 | normal | 邮箱格式校验 | 无效邮箱→提示错误 |
| F17-03 | normal | 密码强度校验 | 弱密码→提示要求 |
| F17-04 | boundary | 已存在邮箱 | 提示已注册、建议登录 |
| F17-05 | boundary | 254 字符邮箱 | RFC 5322 校验 |
| F17-06 | boundary | 特殊字符密码 | 允许/正确存储 |
| F17-07 | error | 空字段提交 | 校验提示 |
| F17-08 | cross | 注册后自动登录 | token 存储+模型列表加载 |
| F17-09 | cross | 注册限流3次/小时) | 超限提示 |
| F17-10 | cross | 注册后立即发消息 | 全链路正常 |
### F-18 登录12 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F18-01 | normal | 正常登录 | token 存储+进入聊天 |
| F18-02 | normal | 错误密码 | 提示密码错误 |
| F18-03 | normal | 不存在用户 | 提示用户不存在 |
| F18-04 | boundary | 密码错误 5 次 | 账户锁定 15 分钟 |
| F18-05 | boundary | 锁定后等待 15 分钟 | 可重新登录 |
| F18-06 | normal | 登录后 token 存储 | OS keyring 有值 |
| F18-07 | normal | 登录后模型列表加载 | SaaS 白名单模型显示 |
| F18-08 | boundary | 多设备登录 | 允许/不互踢 |
| F18-09 | cross | 登录限流5次/分钟) | 超限提示 |
| F18-10 | cross | 记住登录状态 | 重启后不需重新登录 |
| F18-11 | cross | 登录后 UI 状态 | 模式/主题/设置恢复 |
| F18-12 | cross | 登录+降级模式切换 | SaaS 模式↔本地模式 |
### F-19 Token 刷新10 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F19-01 | normal | 正常刷新 | 新 token 对+旧 token 失效 |
| F19-02 | normal | access 过期自动刷新 | 无感刷新+继续对话 |
| F19-03 | boundary | 刷新时发送消息 | 不丢失+正确处理 |
| F19-04 | boundary | refresh token 单次使用 | 二次使用被拒 |
| F19-05 | error | 刷新失败 | 重新登录提示 |
| F19-06 | cross | 刷新后继续对话 | 上下文完整 |
| F19-07 | cross | 并发请求触发刷新 | 不重复刷新+不竞态 |
| F19-08 | cross | 刷新+用量统计正确 | token 不丢失 |
| F19-09 | cross | 刷新+旧 token 失效 | DB 中旧 token 已撤销 |
| F19-10 | cross | 刷新+cookie 更新 | HttpOnly cookie 更新 |
---
## Batch 3Hands + 记忆F-10~F-1674 场景)
### F-10 触发 Hand11 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F10-01 | normal | 触发 Browser Hand | HandStart→执行→HandEnd 正确 |
| F10-02 | normal | 触发 Collector Hand | 数据收集+结果返回 |
| F10-03 | normal | 触发 Researcher Hand | 深度研究+结果返回 |
| F10-04 | normal | LLM 自动触发 Hand | 对话中 LLM 决定调用 Hand |
| F10-05 | normal | 手动触发 Hand | 自动化面板→选择→执行 |
| F10-06 | boundary | 触发+流式展示 | 进度指示+结果渲染 |
| F10-07 | boundary | 触发失败 | 错误提示+可重试 |
| F10-08 | error | 无权限触发 | 提示权限不足 |
| F10-09 | error | 依赖缺失WebDriver/FFmpeg | 明确提示缺什么 |
| F10-10 | cross | 并发触发 2 个 Hand | 队列或并行+不冲突 |
| F10-11 | cross | 触发+记忆存储 | Hand 结果存入记忆 |
### F-11 Hand 审批10 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F11-01 | normal | 审批通过 | 审批→执行→结果返回 |
| F11-02 | normal | 审批拒绝 | 拒绝→提示取消 |
| F11-03 | boundary | 审批超时 | 超时后自动取消或提示 |
| F11-04 | boundary | 审批弹窗展示 | 需求信息完整+操作按钮 |
| F11-05 | error | 审批后执行失败 | 错误提示+可重试 |
| F11-06 | cross | 审批+流式中 | 不影响当前流 |
| F11-07 | cross | 多 Hand 同时审批 | 各自独立 |
| F11-08 | cross | 审批日志记录 | 操作日志有记录 |
| F11-09 | cross | 审批+用量统计 | token 正确计入 |
| F11-10 | cross | 审批+记忆提取 | 结果触发记忆 |
### F-12 Hand 结果查看10 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F12-01 | normal | 正常查看结果 | 聊天中结果展示 |
| F12-02 | normal | 结果详情弹窗 | 完整数据展示 |
| F12-03 | boundary | 失败结果展示 | 错误信息清晰 |
| F12-04 | boundary | 结果含附件 | 附件可查看/下载 |
| F12-05 | boundary | 结果含数据表格 | 表格正确渲染 |
| F12-06 | normal | 历史 Hand 结果 | 历史列表可查看 |
| F12-07 | error | 结果持久化失败 | 不丢结果+提示 |
| F12-08 | cross | 结果+重新执行 | 可重新运行 |
| F12-09 | cross | 结果+记忆提取 | 结果触发记忆存储 |
| F12-10 | cross | 结果+上下文引用 | 后续对话可引用 Hand 结果 |
### F-13 Browser 自动化10 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F13-01 | normal | 打开网页 | URL 加载+截图返回 |
| F13-02 | normal | 截图操作 | 截图正确+展示 |
| F13-03 | normal | 点击操作 | 元素点击+页面变化 |
| F13-04 | normal | 填表操作 | 表单填写+提交 |
| F13-05 | normal | 搜索操作 | 搜索+结果返回 |
| F13-06 | boundary | 多步骤操作 | 步骤链正确执行 |
| F13-07 | error | 页面超时 | 超时提示+可重试 |
| F13-08 | error | WebDriver 未连接 | 明确提示+连接指引 |
| F13-09 | cross | 结果在聊天展示 | 格式正确+可交互 |
| F13-10 | cross | 结果+记忆存储 | 浏览器内容存入记忆 |
### F-14 记忆搜索11 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F14-01 | normal | 搜索中文关键词 | FTS5+TF-IDF 结果正确 |
| F14-02 | normal | 搜索英文关键词 | 结果正确 |
| F14-03 | normal | 搜索代码片段 | 关键词优先策略 |
| F14-04 | boundary | 模糊搜索 | 部分匹配返回 |
| F14-05 | boundary | 无结果搜索 | 提示无结果 |
| F14-06 | boundary | 精确匹配 | 高分结果排前 |
| F14-07 | boundary | 排序验证 | TF-IDF 权重排序正确 |
| F14-08 | normal | 分类过滤 | Preference/Knowledge/Experience 分开 |
| F14-09 | cross | Agent 隔离 | 只返回当前 Agent 记忆 |
| F14-10 | cross | 分页/大量结果 | 不崩溃+可翻页 |
| F14-11 | cross | 搜索性能 | <500ms 返回 |
### F-15 记忆自动注入11 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F15-01 | normal | 自动提取偏好 | "我喜欢深色主题"→偏好记忆 |
| F15-02 | normal | 自动提取知识 | "Python 3.12 新特性是..."→知识记忆 |
| F15-03 | normal | 自动提取经验 | "上次部署失败了因为..."→经验记忆 |
| F15-04 | boundary | Token 预算控制 | 不超过 system prompt 预算 |
| F15-05 | boundary | 注入格式正确 | 结构化上下文块格式 |
| F15-06 | boundary | 流式中注入 | 不影响当前流 |
| F15-07 | error | 注入溢出 | 超预算时截断+不崩溃 |
| F15-08 | cross | 去重 | 不重复注入相同记忆 |
| F15-09 | cross | Agent 隔离 | Agent 独立注入 |
| F15-10 | cross | 跨会话注入 | 新会话检索旧记忆注入 |
| F15-11 | cross | 进化引擎联动 | 积累模式检测进化建议 |
### F-16 记忆手动管理11 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F16-01 | normal | 查看统计 | 总数/分类数/容量 |
| F16-02 | normal | 导出全部 | JSON 格式+完整 |
| F16-03 | normal | 导入记忆 | 正确导入+去重 |
| F16-04 | normal | 删除单条 | 删除后列表更新 |
| F16-05 | normal | 删除全部 | 确认清空+统计归零 |
| F16-06 | boundary | 查看详情 | 完整内容+元数据 |
| F16-07 | error | 编辑记忆 | 不崩溃 |
| F16-08 | cross | 批量操作 | 多选删除 |
| F16-09 | cross | 存储路径显示 | SQLite 路径正确 |
| F16-10 | cross | 容量限制 | 大量记忆不崩溃 |
| F16-11 | cross | 数据完整性 | 导出删除导入一致 |
---
## Batch 4SaaS + 管家F-20~F-2564 场景)
### F-20 订阅管理10 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F20-01 | normal | 查看计划列表 | 显示所有计费计划 |
| F20-02 | normal | 查看当前订阅 | 计划名+到期日+用量 |
| F20-03 | normal | 升级计划 | FreePro配额增加 |
| F20-04 | normal | 降级计划 | ProFree配额减少 |
| F20-05 | boundary | 免费计划限制 | 超配额提示升级 |
| F20-06 | boundary | 计划对比 | 功能差异清晰 |
| F20-07 | error | 订阅过期 | 提示续费+降级处理 |
| F20-08 | cross | 订阅+用量展示 | 用量数据一致 |
| F20-09 | cross | 订阅+模型限制 | 低级计划模型受限 |
| F20-10 | cross | Admin 管理订阅 | Admin 可修改用户订阅 |
### F-21 支付计费12 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F21-01 | normal | 正常支付流程 | 选择计划支付确认 |
| F21-02 | normal | 支付宝模拟 | mock 路由回调成功 |
| F21-03 | normal | 微信模拟 | mock 路由回调成功 |
| F21-04 | boundary | 支付失败 | 回调失败提示+可重试 |
| F21-05 | normal | 支付回调验证 | 签名/金额校验 |
| F21-06 | normal | 发票生成 | 自动生成+可查看 |
| F21-07 | normal | 发票 PDF | 下载 PDF 内容正确 |
| F21-08 | cross | 用量统计 | 请求/token 计数正确 |
| F21-09 | cross | 配额耗尽 | 超额提示升级 |
| F21-10 | cross | 配额实时递增 | 每次请求+1 |
| F21-11 | cross | 聚合器数据 | aggregate_usage Worker 数据 |
| F21-12 | cross | 支付+订阅联动 | 支付成功订阅状态更新 |
### F-22 Admin 后台10 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F22-01 | normal | Dashboard 展示 | 统计数据正确+图表 |
| F22-02 | normal | 账号管理 CRUD | 列表/创建/编辑/禁用 |
| F22-03 | normal | 模型服务配置 | Provider/模型/Key CRUD |
| F22-04 | normal | API 密钥管理 | 加密存储+启停+删除 |
| F22-05 | normal | 知识库管理 | 分类/条目/搜索 |
| F22-06 | normal | 行业配置 | 4 内置行业+自定义 |
| F22-07 | normal | 计费管理 | 计划/订阅/用量 |
| F22-08 | normal | 角色权限 | RBAC+权限模板 |
| F22-09 | normal | 操作日志 | 查询+筛选+分页 |
| F22-10 | normal | Agent 模板 | 模板 CRUD+分配 |
### F-23 简洁/专业模式10 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F23-01 | normal | 默认简洁模式 | 隐藏高级功能 |
| F23-02 | normal | 切换到专业模式 | 显示完整功能面板 |
| F23-03 | normal | 切回简洁模式 | 重新隐藏高级功能 |
| F23-04 | boundary | 简洁模式功能验证 | 只展示聊天+基础操作 |
| F23-05 | boundary | 专业模式功能验证 | 所有面板可用 |
| F23-06 | boundary | 聊天中切换 | 不影响当前对话 |
| F23-07 | cross | 切换+设置保留 | 模式切换后设置不变 |
| F23-08 | cross | 首次启动默认模式 | 简洁模式为默认 |
| F23-09 | cross | 模式+行业联动 | 行业配置在两种模式都生效 |
| F23-10 | cross | 模式+记忆展示 | 专业模式显示更多记忆信息 |
### F-24 行业配置10 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F24-01 | normal | 选择医疗行业 | 关键词加载+管家面板更新 |
| F24-02 | normal | 选择教育行业 | 关键词加载+模板推荐 |
| F24-03 | normal | 选择电商行业 | 关键词加载 |
| F24-04 | normal | 自定义行业 | 关键词自定义+保存 |
| F24-05 | boundary | 行业关键词匹配 | ButlerRouter 检测行业关键词 |
| F24-06 | cross | 行业+管家联动 | 行业 prompt 注入 system prompt |
| F24-07 | cross | 行业+痛点联动 | 行业相关痛点分类 |
| F24-08 | cross | 行业+Pipeline 联动 | 推荐行业相关模板 |
| F24-09 | cross | 行业切换 | 切换行业关键词更新 |
| F24-10 | cross | 行业+记忆 | 行业相关记忆优先检索 |
### F-25 痛点积累12 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F25-01 | normal | 自动提取痛点 | 聊天中抱怨痛点提取 |
| F25-02 | normal | 痛点列表展示 | 管家面板显示痛点 |
| F25-03 | normal | 痛点积累到阈值 | 多次抱怨积累计数 |
| F25-04 | normal | 方案生成 | 阈值触发生成解决建议 |
| F25-05 | normal | 方案状态更新 | 接受/拒绝/搁置 |
| F25-06 | boundary | 痛点+行业联动 | 行业分类痛点 |
| F25-07 | cross | 痛点跨会话 | 昨天痛点今天可见 |
| F25-08 | cross | 痛点+记忆 | 痛点存入记忆系统 |
| F25-09 | cross | 痛点去重 | 相同痛点不重复记录 |
| F25-10 | cross | 痛点+经验 | painsolutionoutcome |
| F25-11 | cross | 痛点+冷启动 | 新用户首次痛点提取 |
| F25-12 | cross | 痛点+用户画像 | 画像反映痛点偏好 |
---
## Batch 5Pipeline + 配置 + 安全F-26~F-3383 场景)
### F-26 选择模板10 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F26-01 | normal | 列出所有模板 | 18 YAML 模板 |
| F26-02 | normal | 按行业过滤 | 医疗/教育/电商等 |
| F26-03 | normal | 模板详情 | 步骤+依赖+参数 |
| F26-04 | normal | 模板参数展示 | 输入/输出定义 |
| F26-05 | boundary | 模板预览 | YAML 解析正确 |
| F26-06 | boundary | 模板搜索 | 关键词匹配 |
| F26-07 | error | YAML 解析错误 | 不崩溃+提示 |
| F26-08 | cross | Pipeline 意图匹配 | 自然语言模板推荐 |
| F26-09 | cross | 模板+行业联动 | 行业模板优先 |
| F26-10 | cross | 模板收藏 | 收藏+列表 |
### F-27 参数配置10 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F27-01 | normal | 正常配置参数 | 保存成功 |
| F27-02 | normal | 必填项校验 | 空必填提示 |
| F27-03 | normal | 参数类型校验 | 数字/字符串/枚举 |
| F27-04 | boundary | 默认值填充 | 预填默认值 |
| F27-05 | boundary | 参数说明 | 每个参数有说明 |
| F27-06 | error | 配置保存失败 | 不丢原配置 |
| F27-07 | cross | 配置+预览 | 预览显示参数效果 |
| F27-08 | cross | 配置重置 | 恢复默认 |
| F27-09 | cross | 配置+验证 | 提交前验证 |
| F27-10 | cross | 配置导入导出 | JSON/YAML 导出+导入 |
### F-28 执行工作流10 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F28-01 | normal | 正常执行 | DAG 排序+逐步执行+完成 |
| F28-02 | normal | DAG 排序正确 | 依赖关系满足 |
| F28-03 | normal | 并行步骤 | 无依赖步骤并行 |
| F28-04 | error | 步骤失败 | 失败步骤+后续处理 |
| F28-05 | error | 步骤超时 | 超时处理+可重试 |
| F28-06 | normal | 取消执行 | 取消+状态更新 |
| F28-07 | normal | 执行进度 | 实时进度展示 |
| F28-08 | normal | 执行结果 | 结果数据完整 |
| F28-09 | cross | 执行+Hand 触发 | 步骤触发 Hand |
| F28-10 | cross | 执行+记忆存储 | 结果存入记忆 |
### F-29 模型设置10 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F29-01 | normal | 配置 API Key | 8 Provider 配置 |
| F29-02 | normal | 选择 Provider | 下拉选择 |
| F29-03 | normal | 测试连接 | 验证 Key 有效 |
| F29-04 | normal | 模型参数 | 温度/max_tokens |
| F29-05 | boundary | Provider | 同时配置多个 |
| F29-06 | normal | 配置持久化 | 重启后保留 |
| F29-07 | normal | 配置热重载 | 不需重启生效 |
| F29-08 | cross | 配置+降级 | Provider 不可用降级 |
| F29-09 | cross | 配置校验 | 无效 Key提示 |
| F29-10 | cross | 配置导入导出 | TOML 导出+导入 |
### F-30 工作区配置11 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F30-01 | normal | 基本配置 | 工作区路径等 |
| F30-02 | normal | 环境变量 | ${VAR} 插值 |
| F30-03 | normal | 数据目录 | 路径设置 |
| F30-04 | normal | 日志级别 | debug/info/warn/error |
| F30-05 | boundary | 配置文件路径 | 正确读写 |
| F30-06 | error | 配置写入失败 | 不丢原配置 |
| F30-07 | cross | TOML 格式 | 格式一致 |
| F30-08 | cross | 特殊字符 | 路径含空格/中文 |
| F30-09 | cross | 配置同步 | 多设备同步 |
| F30-10 | cross | 配置重置 | 恢复默认 |
| F30-11 | cross | 配置+环境变量插值 | ${VAR_NAME} 解析 |
### F-31 数据隐私10 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F31-01 | normal | 清除对话历史 | 确认清除+统计归零 |
| F31-02 | normal | 导出数据 | JSON 格式+完整 |
| F31-03 | normal | 记忆管理 | 查看/删除/导出 |
| F31-04 | boundary | 删除确认 | 二次确认弹窗 |
| F31-05 | normal | 删除持久化验证 | SQLite/IndexedDB 数据清除 |
| F31-06 | normal | 导出格式 | 格式正确+可解析 |
| F31-07 | cross | 导出完整性 | 消息+记忆+配置完整 |
| F31-08 | cross | 清除+Agent 联动 | 清除指定 Agent 数据 |
| F31-09 | cross | 清除+记忆联动 | 清除对话+保留/清除记忆 |
| F31-10 | cross | 数据统计 | 清除后统计更新 |
### F-32 JWT 认证12 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F32-01 | normal | 获取 JWT | 登录token 存储 |
| F32-02 | normal | JWT 过期处理 | 自动刷新或提示重新登录 |
| F32-03 | normal | JWT 刷新 | token+ token 失效 |
| F32-04 | normal | pwv 失效机制 | 改密码 JWT 全部失效 |
| F32-05 | boundary | cookie 双通道 | Tauri keyring + HttpOnly cookie |
| F32-06 | normal | Keyring 存储 | Win DPAPI 存储 |
| F32-07 | normal | refresh token 单次使用 | 二次使用被拒 |
| F32-08 | normal | refresh token 撤销 | logoutDB 中标记 |
| F32-09 | boundary | 并发 JWT 验证 | 不竞态 |
| F32-10 | cross | JWT+角色权限 | Claims.role 正确 |
| F32-11 | cross | JWT+限流 | 超限返回 429 |
| F32-12 | cross | JWT+多设备 | 多设备 token 独立 |
### F-33 TOTP 2FA10 场景)
| ID | 类别 | 场景 | 验证点 |
|----|------|------|--------|
| F33-01 | normal | 设置 2FA | QR 码生成+密钥加密存储 |
| F33-02 | normal | QR 码生成 | 可扫描+格式正确 |
| F33-03 | normal | 验证码验证 | 正确 TOTP通过 |
| F33-04 | normal | 禁用 2FA | 需密码确认禁用 |
| F33-05 | boundary | 错误验证码 | 提示错误 |
| F33-06 | boundary | 过期验证码 | 提示过期 |
| F33-07 | cross | 2FA+登录流程 | 密码TOTP进入 |
| F33-08 | cross | 2FA+密码确认 | 禁用需密码 |
| F33-09 | cross | 2FA 密钥加密 | AES-256-GCM 加密 |
| F33-10 | cross | 2FA+多设备 | 各设备独立密钥 |
---
## 3 角色冒烟测试
### 角色 1新用户"小王"(首次使用)
| 步骤 | 操作 | 验证点 |
|------|------|--------|
| 1 | 打开应用看到冷启动引导 | 引导消息出现+4阶段流程 |
| 2 | 注册账号登录 | token 存储+进入简洁模式 |
| 3 | 第一次发消息"你好" | 流式响应正常 |
| 4 | 切换到专业模式 | 功能面板展示 |
| 5 | 创建新 Agent和它对话 | Agent 独立会话 |
| 6 | 设置>查看记忆 | 确认自动提取了偏好 |
| 7 | 第二天打开(模拟) | 跨会话记忆注入 |
| 8 | 触发一个 Hand | 审批流程正常 |
覆盖: F-17, F-18, F-23, F-01, F-02, F-06, F-14, F-04, F-11
### 角色 2医院行政"李主任"(管家模式)
| 步骤 | 操作 | 验证点 |
|------|------|--------|
| 1 | 登录→选择"医疗"行业 | 行业关键词加载 |
| 2 | "帮我整理本周会议纪要" | ButlerRouter 医疗匹配 |
| 3 | "最近排班总出问题" | 痛点提取触发 |
| 4 | 连续几天聊排班 | 痛点积累→方案建议 |
| 5 | "上个月讨论的排班方案" | 跨会话记忆检索 |
| 6 | 查看管家面板 | 洞察/方案/记忆展示正确 |
| 7 | 专业模式→选 Pipeline 模板 | 医疗模板推荐 |
| 8 | 执行 Pipeline | DAG 执行+结果 |
覆盖: F-01, F-02, F-23, F-24, F-25, F-14, F-15, F-26, F-28
### 角色 3Admin 运维"张工"(后台管理)
| 步骤 | 操作 | 验证点 |
|------|------|--------|
| 1 | Admin V2 登录 | Dashboard 统计正确 |
| 2 | 检查模型服务 | Provider+Key 状态 |
| 3 | 检查账号管理 | 用户列表+CRUD |
| 4 | 检查知识库 | CRUD+搜索+pgvector |
| 5 | 检查行业配置 | 4 内置行业 |
| 6 | 检查计费 | 订阅+用量+支付 |
| 7 | 检查角色权限 | RBAC 验证 |
| 8 | 切回桌面端 | Admin 操作已生效 |
覆盖: F-22, F-20, F-21, F-29, F-32, F-33
---
## 执行计划
| 阶段 | 时长 | 内容 |
|------|------|------|
| 0 | 15min | 环境检查PostgreSQL + SaaS + 桌面端 + 连通验证 |
| 1 | 2-3h | Batch 1 核心聊天52 场景) |
| 2 | 2-3h | Batch 2 Agent+认证72 场景) |
| 3 | 2-3h | Batch 3 Hands+记忆74 场景) |
| 4 | 2-3h | Batch 4 SaaS+管家64 场景) |
| 5 | 2-3h | Batch 5 Pipeline+配置+安全83 场景) |
| 6 | 2h | 复合转换测试(跨 Batch 交互) |
| 7 | 1.5h | 3 角色冒烟测试 |
| 8 | 30min | 报告整理+证据归档 |
**总计:~345 个测试场景**
每个场景执行流程:
1. 截图当前状态before
2. 执行操作click/type/wait
3. 等待响应wait_for + 超时保护)
4. 验证结果query_page + execute_js
5. 截图最终状态after
6. 记录结果PASS/FAIL/PARTIAL + 证据路径)
## 结果报告
输出:`docs/test-evidence/2026-04-XX/FEATURE_CHAIN_EXHAUSTIVE_TEST.md`
报告格式:
- 转换矩阵报告(状态 × 状态 网格)
- 每条链路 PASS/FAIL/PARTIAL 统计
- Bug 密度热力图(按状态)
- 截图证据目录(按场景 ID 命名)