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 |
!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-05,52 场景)
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 2:Agent + 认证(F-06F-09, F-17F-19,72 场景)
F-06 创建 Agent(10 场景)
| 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 切换 Agent(10 场景)
| 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 配置 Agent(10 场景)
| 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 删除 Agent(10 场景)
| 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 3:Hands + 记忆(F-10~F-16,74 场景)
F-10 触发 Hand(11 场景)
| 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 4:SaaS + 管家(F-20~F-25,64 场景)
F-20 订阅管理(10 场景)
| ID |
类别 |
场景 |
验证点 |
| F20-01 |
normal |
查看计划列表 |
显示所有计费计划 |
| F20-02 |
normal |
查看当前订阅 |
计划名+到期日+用量 |
| F20-03 |
normal |
升级计划 |
Free→Pro→配额增加 |
| F20-04 |
normal |
降级计划 |
Pro→Free→配额减少 |
| 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 |
痛点+经验 |
pain→solution→outcome 链 |
| F25-11 |
cross |
痛点+冷启动 |
新用户首次痛点提取 |
| F25-12 |
cross |
痛点+用户画像 |
画像反映痛点偏好 |
Batch 5:Pipeline + 配置 + 安全(F-26~F-33,83 场景)
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 撤销 |
logout→DB 中标记 |
| F32-09 |
boundary |
并发 JWT 验证 |
不竞态 |
| F32-10 |
cross |
JWT+角色权限 |
Claims.role 正确 |
| F32-11 |
cross |
JWT+限流 |
超限返回 429 |
| F32-12 |
cross |
JWT+多设备 |
多设备 token 独立 |
F-33 TOTP 2FA(10 场景)
| 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
角色 3:Admin 运维"张工"(后台管理)
| 步骤 |
操作 |
验证点 |
| 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 个测试场景
每个场景执行流程:
- 截图当前状态(before)
- 执行操作(click/type/wait)
- 等待响应(wait_for + 超时保护)
- 验证结果(query_page + execute_js)
- 截图最终状态(after)
- 记录结果(PASS/FAIL/PARTIAL + 证据路径)
结果报告
输出:docs/test-evidence/2026-04-XX/FEATURE_CHAIN_EXHAUSTIVE_TEST.md
报告格式:
- 转换矩阵报告(状态 × 状态 网格)
- 每条链路 PASS/FAIL/PARTIAL 统计
- Bug 密度热力图(按状态)
- 截图证据目录(按场景 ID 命名)