20 KiB
ZCLAW 发布前功能测试方案
日期: 2026-04-08 状态: Draft 基于: 两轮头脑风暴产品愿景 + 25 轮 tauri-mcp 测试结果 目标: 全功能可用验证 — 所有 UI 入口点接通真实后端,允许有 bug 但不能 crash
Context
ZCLAW 经过 12 轮审计修复,1048 个自动化测试通过,25 轮 tauri-mcp 实景测试已完成核心路径验证(SSE、多轮对话、话题切换)。但在发布前仍有:
- 未验证的能力:Pipeline 实际执行、Hand 触发、Skill 安装/卸载、Agent 完整创建流程、模型切换
- 遗留问题:6 个 P2/P3(Token 计数为 0、Kimi ENTITY bug、配额 429、对话列表冗余等)
- 产品愿景验证:两轮头脑风暴确立了"成长性问题解决者"定位,需要用真实行业场景验证
本方案旨在通过多角色真实 LLM 交互测试,全面验证系统发布就绪度。
0. 范围澄清
0.1 与 04-05 预发布审计的关系
本方案补充而非替代 2026-04-05-pre-launch-functional-audit-design.md。04-05 方案是模块级功能审计(12 模块 T1-T12),本方案是角色驱动的端到端集成测试。
| 04-05 模块 | 本方案覆盖 | 状态 |
|---|---|---|
| T1 Hands | 角色 A (Researcher/Collector/Browser) | 本方案 |
| T2 Intelligence | 角色 B (记忆+反思) | 本方案 |
| T3 Chat/SSE | 角色 A+B+C | 本方案 |
| T4 Agent | 角色 B (创建/切换/人格) | 本方案 |
| T5 Skills | 角色 B (执行+结果) | 本方案 |
| T6 Pipeline | 角色 A (模板+执行) | 本方案 |
| T7 Browser Hand | 角色 A (导航+截图) | 本方案 |
| T8 Memory | 角色 B (VikingPanel) | 本方案 |
| T9 Admin V2 | 不在本方案范围 | 已有 61 测试覆盖 |
| T10 Security | 角色 B (Audit 日志) | 部分 |
| T11 SaaS API | 角色 B (配额+计费) | 部分 |
| T12 E2E 集成 | 三角色本身就是 E2E | 本方案 |
0.2 前序测试基线
开始本方案前,确认以下自动化测试基线通过:
# Rust 全量(排除 SaaS)
cargo test --workspace --exclude zclaw-saas # 580 tests passing
# SaaS 集成(需 PostgreSQL)
cargo test -p zclaw-saas -- --test-threads=1 # 138 tests passing
# 前端
cd desktop && pnpm vitest run # 330 passed, 1 skipped
# 类型检查
pnpm tsc --noEmit # 0 errors
0.3 Phase 0:环境就绪检查
在 Phase 1 开始前,确认以下环境就绪:
| # | 检查项 | 验证方法 | 通过标准 |
|---|---|---|---|
| 0.1 | Tauri 开发服务 | pnpm start:dev |
应用窗口正常打开,无白屏 |
| 0.2 | tauri-mcp 连接 | Chrome DevTools MCP 连接 | take_snapshot 返回页面结构 |
| 0.3 | SaaS 后端 | Admin 页面可访问 | Dashboard 正常加载 |
| 0.4 | LLM API 冒烟测试 | 三模型各发一条消息 | Kimi/GLM/DeepSeek 均有响应 |
| 0.5 | 自动化基线 | 运行 §0.2 命令 | 全部通过 |
1. 测试策略
1.1 方案选择:角色驱动 + 功能矩阵混合式
以三个不同行业角色为主线驱动测试,同时用功能矩阵确保 100% UI 入口点覆盖:
Phase 1: 基础连接+认证(无角色,通用验证)
Phase 2: 角色 A — 玩具厂老板 + Kimi
Phase 3: 角色 B — 医院行政 + GLM-4-Flash
Phase 4: 角色 C — 高中教师 + DeepSeek-V3
Phase 5: 功能矩阵交叉验证(checklist 补漏)
Phase 6: 修复验证 + 发布评估
1.2 测试方式
- 工具: tauri-mcp / tauri-devtools 真实 LLM 交互
- 执行方式: 边测边修(发现问题当场修复或记录后当轮修复)
- 预计总轮次: 60-72 轮(Phase 0: ~5, Phase 1: ~10, Phase 2: 18-22, Phase 3: 18-22, Phase 4: 15-18, Phase 5-6: ~5)
1.3 配额预算
| 角色 | 预计 API 调用 | 含 Hands/Skills 开销 | 总计 |
|---|---|---|---|
| Phase 0-1 | ~15 | 0 | 15 |
| 角色 A (Kimi) | ~22 | Researcher(3) + Collector(2) + Browser(2) + Pipeline(3) | 32 |
| 角色 B (GLM) | ~22 | Skills(2) + 记忆(1) | 25 |
| 角色 C (DeepSeek) | ~18 | Quiz(2) + Slideshow(1) + TTS(1) | 22 |
| Phase 5-6 | ~5 | 0 | 5 |
| 总计 | ~99 |
配额策略:
- 使用付费套餐(非 free plan 100 次限制),或 Admin 后台将测试账号配额提升至 200 次
- 准备 2 个测试账号,一个主用(配额 200+),一个备用
- 如果主账号配额耗尽,切换到备用账号继续测试
- 每个 Phase 结束后检查剩余配额,低于 20 次时切换账号
1.4 测试数据隔离
- 三个角色使用同一个 SaaS 账号但不同的 Agent 分身,状态共享
- 角色 B 的记忆测试可以观察到角色 A 的对话(验证跨 Agent 记忆隔离)
- 配额在三个角色间共享,按角色 A → B → C 的顺序消耗
- 每个 Phase 开始前记录当前对话数和配额余量
2. 测试角色与功能分工
2.1 三个测试角色
| 角色 | 身份 | LLM 模型 | 测试重点 | 预计轮次 |
|---|---|---|---|---|
| A. 玩具厂老板 | 汕头澄海,盲盒+注塑 | Kimi (kimi-for-coding) | 核心聊天、Hands(Researcher/Collector/Browser)、Pipeline 行业模板、配额管理 | 18-22 轮 |
| B. 医院行政 | 某三甲医院行政主任 | GLM-4-Flash | Agent 多分身管理、Skills 调用、记忆系统、SaaS 配额/计费、模型切换 | 18-22 轮 |
| C. 高中教师 | 高二语文/班主任 | DeepSeek-V3 | 多轮对话深度、Classroom/Quiz 生成、Slideshow、Speech TTS、对话搜索 | 15-18 轮 |
2.2 功能覆盖矩阵
B = 主测,X = 交叉验证
| 功能域 | 角色 A | 角色 B | 角色 C |
|---|---|---|---|
| SaaS 登录/认证 | B | X | X |
| SSE 流式响应 | B | X | X |
| 多轮对话 | B | X | B |
| 话题切换 | B | X | X |
| 取消流式 | X | X | B |
| Agent 创建/切换 | X | B | X |
| Agent 人格编辑 | X | B | X |
| 记忆提取/回顾 | X | B | X |
| Skills 执行 | X | B | X |
| Hands 触发 | B | X | X |
| Pipeline 执行 | B | X | X |
| Classroom/Quiz | X | X | B |
| Slideshow | X | X | B |
| Speech TTS | X | X | B |
| Browser Hand | B | X | X |
| 模型切换 | X | B | X |
| 对话搜索 | X | X | B |
| 配额/计费 | X | B | X |
| Thinking 渲染 | B | X | X |
| 离线队列 | X | B | X |
| 侧边栏 Tab 切换 | B | B | B |
3. 六阶段执行流程
Phase 1:基础连接与认证(~10 轮)
目标: 确保所有连接模式可用,不被底层问题干扰后续角色测试
| # | 测试项 | 验证方法 | Pass 标准 |
|---|---|---|---|
| 1.1 | SaaS 登录 | 通过 tauri-mcp 发送消息 | 成功获取 session + 模型列表加载 |
| 1.2 | 会话恢复 | 重启 Tauri 应用后检查 | 自动恢复登录态,无需重新认证 |
| 1.3 | SSE 流式响应 | 发送简单问题 | thinking + content 双流正常渲染 |
| 1.4 | 取消流式 | 发送长问题后点击取消 | 状态正确恢复,可立即发新消息 |
| 1.5 | 侧边栏 Tab 切换 | 逐个点击 Chat/Agent/Memory/Automation/Skills | 每个 Tab 内容区正确更新,无白屏 |
| 1.6 | 对话列表 | 创建新对话 → 切换 → 搜索关键词 | CRUD 完整,搜索结果准确 |
| 1.7 | 模型列表加载 | 打开模型选择器 | 显示当前 SaaS 账户可用模型 |
| 1.8 | 遗留问题重现 | 逐个检查上次 6 个 P2/P3 | 确认已修复/仍存在/部分改善 |
Pass 条件: 1.1-1.5 全部通过才能进入 Phase 2。1.6-1.8 允许有问题但不阻塞。
Phase 2:角色 A — 玩具厂老板 + Kimi(18-22 轮)
场景: 汕头澄海玩具厂老板,想开发盲盒产品线,需要市场调研、供应商联系、展会信息。
| # | 测试项 | 场景动作 | 验证点 |
|---|---|---|---|
| A1 | 多轮行业对话 | "我想做盲盒,市面上哪些品牌卖得好?" → "这些材质有什么区别?" → "注塑成本怎么算?" | 上下文连续、行业知识准确、无信息丢失 |
| A2 | 话题切换 | 盲盒 → 供应商采购 → 展会 → 回到盲盒话题 | 回溯准确,不丢失之前的讨论细节 |
| A3 | Hands: Researcher | "帮我调研一下 2026 年盲盒市场趋势" | 工具调用成功,返回结构化研究报告 |
| A4 | Hands: Collector | "整理一份注塑机供应商对比表,包含价格和产能" | 输出结构化表格,格式正确 |
| A5 | Pipeline 执行 | 触发"市场调研"行业模板 | Pipeline 步骤逐步执行,状态跟踪正确,结果可查看 |
| A6 | Thinking 渲染 | 观察含 thinking 的回复 | 折叠/展开正常,thinking 内容完整,不影响 content |
| A7 | 长消息处理 | "详细列出从设计到量产的完整开模流程" | 完整输出,不被截断,段落格式正确 |
| A8 | 中英文混合 | "帮我写一封给 Hasbro 的英文合作邮件" → 后续用中文讨论 | 语言切换自然,上下文不混乱 |
| A9 | 数学计算 | "月产 5 万个盲盒,每个成本 3.5 元,利润率 40%,月利润多少?" | 计算正确(70,000 元) |
| A10 | 配额边界 | 持续使用观察配额消耗 | 接近上限时有友好提示,429 响应处理正确 |
| A11 | Browser Hand | "打开 1688 搜一下注塑机价格" | 若 Fantoccini 已安装:触发自动化 + Approval 弹窗;若未安装:标注 KNOWN,跳过测试 |
| A12 | Kimi ENTITY bug | 切换到 Flash 模式测试 | 检查 __ENTITY_N__ 是否仍出现,评估影响 |
| A13 | 侧边栏导航 | 在 Chat ↔ Hands ↔ Pipeline 间频繁切换 | 内容区更新正确,无白屏或残留 |
Pass 条件: 核心项 A1-A5 全部通过。A6-A10 为扩展项,允许 <= 2 项失败。A11 Browser Hand 若 Fantoccini 未安装则标注为 KNOWN,不计入 Pass/Fail。
Phase 3:角色 B — 医院行政 + GLM-4-Flash(18-22 轮)
场景: 某三甲医院行政主任,管理多个科室文档,需要 AI 助手处理不同科室事务并记住各科室特殊要求。
| # | 测试项 | 场景动作 | 验证点 |
|---|---|---|---|
| B1 | Agent 创建 | 创建"内科助手"、"外科助手"两个分身 | Agent 表单完整,保存成功,出现在列表 |
| B2 | Agent 人格编辑 | 给内科助手设置专业人格 + 科室术语 | 人格 prompt 生效,后续对话体现专业术语 |
| B3 | Agent 切换 | 在两个分身间切换对话 | 上下文独立不串台,各自记住自己的话题 |
| B4 | 记忆积累 | 多次提及"我们医院 ICU 床位 30 张" | 后续对话 AI 记住并引用这个事实 |
| B5 | 记忆回顾 | 打开 VikingPanel 查看记忆列表 | 显示已积累的记忆条目,可搜索 |
| B6 | Skills 执行 | 触发文档处理 skill | Skill 正确执行并返回结果 |
| B7 | 模型切换 | 从 GLM 切到 DeepSeek → 再切回 GLM | 切换立即生效,对话不中断,模型特性可感知 |
| B8 | SaaS 配额查看 | 打开账户/计费面板 | 用量正确显示(验证 Token 计数修复) |
| B9 | 离线测试 | 断网 → 发消息 → 恢复网络 | 离线队列缓存消息,恢复后自动发送 |
| B10 | 搜索对话 | 搜索"ICU"关键词 | 正确过滤出包含 ICU 的对话 |
| B11 | Thinking 模式 | 开启/关闭 Thinking | 状态正确切换,渲染正常 |
| B12 | 反思系统 | 多轮对话后检查反思日志 | reflection 自动触发并记录,日志可查看 |
| B13 | 安全面板 | 打开 Audit 日志 | 显示操作记录,内容完整 |
Pass 条件: 核心项 B1-B7 全部通过。B8-B13 为扩展项,允许 <= 2 项失败。B9 离线测试允许有已知限制。
Phase 4:角色 C — 高中教师 + DeepSeek-V3(15-18 轮)
场景: 高二语文老师兼班主任,需要生成测验、制作课件、用语音朗读课文。
| # | 测试项 | 场景动作 | 验证点 |
|---|---|---|---|
| C1 | 深度多轮对话 | 讨论文言文教学方法 15+ 轮 | 上下文持续积累无丢失,后续引用前文准确 |
| C2 | Quiz 生成 | "生成一套《赤壁赋》理解测验,10 道选择题" | 题目生成完整,格式正确,答案合理 |
| C3 | Slideshow | "帮我做一页《赤壁赋》赏析幻灯片" | 幻灯片生成并预览,可翻页 |
| C4 | Speech TTS | "朗读《赤壁赋》第一段" | 语音合成播放正常,中文发音准确 |
| C5 | Quiz 评估 | 模拟学生答题,系统评分 | 评分逻辑正确,反馈有针对性 |
| C6 | 取消流式 | 在长文生成过程中取消 | 干净取消,UI 状态恢复,可立即继续操作 |
| C7 | 对话搜索 | 搜索"赤壁赋" | 正确匹配相关对话 |
| C8 | 新建对话 | 创建新对话讨论班会方案 | 独立上下文,不与之前的讨论混淆 |
| C9 | 跨话题记忆 | "上次我们讨论的教学方法叫什么?" | 记忆回溯准确,能引用之前对话内容 |
| C10 | 长文本输出 | "写一份完整的家长会发言稿,800 字" | 完整输出,格式正确,不被截断 |
| C11 | DeepSeek 稳定性 | 持续使用 15+ 轮 | 无超时、无 crash、无异常中断 |
| C12 | Classroom 相关 | Classroom 面板查看生成结果 | 生成历史可查看,可复用 |
| C13 | Whiteboard | "在白板上画一个文言文知识图谱" | 白板渲染正常,可导出(允许标注 demo) |
| C14 | 记忆飞轮验证 | 不提关键词,问"我们医院有多少张病床?" | 如果角色 B 的记忆跨 Agent 可见则验证飞轮;否则验证本角色记忆 |
Pass 条件: 核心项 C1-C6 全部通过。C7-C12 为扩展项,允许 <= 2 项失败。C4 TTS 允许有浏览器兼容性限制。
Phase 5:功能矩阵交叉验证(checklist)
逐项检查每个 UI 入口点,确保至少被一个角色覆盖。对照 Phase 2-4 的结果,标记未覆盖项并补充测试。
| 类别 | UI 入口点 | 覆盖角色 | 状态 |
|---|---|---|---|
| 侧边栏 | Chat Tab | Phase 1 | ☐ |
| 侧边栏 | Agent Tab | B | ☐ |
| 侧边栏 | Memory Tab | B | ☐ |
| 侧边栏 | Automation Tab | A | ☐ |
| 侧边栏 | Skills Tab | B | ☐ |
| 聊天区 | 发送消息 | A+B+C | ☐ |
| 聊天区 | 取消流式 | C | ☐ |
| 聊天区 | Thinking 展开/折叠 | A | ☐ |
| 聊天区 | 代码块渲染 | A (中英文) | ☐ |
| 聊天区 | 消息搜索 | C | ☐ |
| 聊天区 | 对话切换 | A+B | ☐ |
| 聊天区 | 新建对话 | C | ☐ |
| Agent | 创建 Agent | B | ☐ |
| Agent | 编辑人格 | B | ☐ |
| Agent | 切换 Agent | B | ☐ |
| Agent | 删除 Agent | B (必测 — 安全相关) | ☐ |
| Hands | 列表展示 | A | ☐ |
| Hands | 触发执行 | A (Researcher/Collector) | ☐ |
| Hands | Approval 弹窗 | A (Browser) | ☐ |
| Hands | 执行日志 | A | ☐ |
| Skills | 列表展示 | B | ☐ |
| Skills | 执行 Skill | B | ☐ |
| Skills | 结果展示 | B | ☐ |
| Pipeline | 模板列表 | A | ☐ |
| Pipeline | 执行 Pipeline | A | ☐ |
| Pipeline | 进度跟踪 | A | ☐ |
| Pipeline | 结果查看 | A | ☐ |
| Memory | VikingPanel | B | ☐ |
| Memory | 记忆列表 | B | ☐ |
| Memory | 记忆搜索 | B | ☐ |
| Browser | 创建会话 | A | ☐ |
| Browser | 导航+截图 | A | ☐ |
| Classroom | Quiz 生成 | C | ☐ |
| Classroom | Quiz 评估 | C | ☐ |
| Slideshow | 生成+预览 | C | ☐ |
| Speech | TTS 播放 | C | ☐ |
| Settings | 连接配置 | B | ☐ |
| Settings | 模型选择 | B | ☐ |
| Settings | Autonomy 级别 | B (必测 — 安全相关) | ☐ |
| SaaS | 登录/登出 | A+B | ☐ |
| SaaS | 账户信息 | B | ☐ |
| SaaS | 配额/计费 | B | ☐ |
| 自动化 | Triggers | A | ☐ |
| 自动化 | Scheduled Tasks | A (如时间允许) | ☐ |
| 安全 | Audit 日志 | B | ☐ |
| 安全 | Approval 队列 | A (Browser) | ☐ |
Phase 6:修复验证 + 发布评估
流程:
- 汇总 Phase 1-5 所有发现的问题
- 按缺陷分级处理:
- P0: 已在测试过程中立即修复
- P1: Phase 6 集中修复
- P2/P3: 记录到发布说明的 known issues
- 修复后回归验证(只测修复点相关的功能)
- 生成发布评估报告
4. 缺陷分级标准
| 级别 | 定义 | 处理方式 | 例子 |
|---|---|---|---|
| P0 - Crash | 应用崩溃、白屏、数据丢失 | 立即停止测试,当场修复 | 窗口崩溃、IndexedDB 损坏 |
| P1 - 阻塞 | 核心功能不可用,无法继续测试 | 当轮修复后重新验证 | SSE 无响应、登录失败、Agent 无法切换 |
| P2 - 功能缺陷 | 功能可用但结果不正确或不完整 | 记录,Phase 6 统一修复 | Token 计数为 0、Pipeline 步骤状态不更新 |
| P3 - 体验问题 | 功能可用但体验不佳 | 记录,发布后迭代 | 对话列表冗余、动画卡顿 |
| KNOWN | 已知的外部限制 | 标注为 known limitation | Kimi __ENTITY_N__、模型 API 超时 |
5. 发布标准(Go/No-Go)
| 指标 | Go(可发布) | No-Go(不可发布) |
|---|---|---|
| P0 缺陷 | 0 | >= 1 |
| P1 缺陷 | <= 2 且有 workaround | >= 3 或无 workaround |
| 核心路径 | 聊天+Agent+认证 100% 通过 | 任一核心路径未覆盖 |
| 功能矩阵覆盖 | >= 90% UI 入口点已测 | < 80% |
| 稳定性 | 单次 50+ 消息无 crash | 50 消息内 crash |
| 多模型验证 | >= 2 个模型完整通过 | 仅 1 个模型通过 |
| React 稳定性 | 无 Maximum update depth 异常 | 出现无限渲染 |
6. 测试报告模板
每个角色测试完成后生成一份结构化报告:
## 角色 X 测试报告
### 基本信息
- 角色: [身份描述]
- 模型: [LLM Provider + Model]
- 执行日期: YYYY-MM-DD
- 轮次: X/Y (实际/计划)
- ZCLAW 版本: [git commit hash 前 8 位]
- Tauri 版本: [从 package.json 获取]
- OS: [Windows 11 / macOS / Linux]
- WebView2 版本: [Edge WebView2 Runtime 版本]
- LLM 套餐: [free / paid]
### 结果汇总
- Pass: X 项
- Fail: Y 项 (P0: _ P1: _ P2: _ P3: _ KNOWN: _)
### 新发现缺陷
| ID | 级别 | 测试项 | 描述 | 复现步骤 | 状态 |
|----|------|--------|------|----------|------|
### 已修复缺陷
| ID | 原级别 | 描述 | 修复方式 | 验证结果 |
|----|--------|------|----------|----------|
### 已知限制
| 描述 | 影响范围 | 建议处理 |
|------|----------|----------|
### 功能覆盖
- 已测 UI 入口点: [列表]
- 未测 UI 入口点: [列表] + 原因
7. 关键文件参考
| 用途 | 文件路径 |
|---|---|
| Tauri 命令注册 | desktop/src-tauri/src/lib.rs |
| 前端 Store | desktop/src/store/ (19 文件) |
| Gateway Client | desktop/src/lib/gateway-client.ts |
| SaaS Client | desktop/src/lib/saas-client.ts |
| Kernel Client | desktop/src/lib/kernel-client.ts |
| WebMCP 工具 | desktop/src/lib/webmcp-tools.ts |
| Hands 配置 | hands/ (9 HAND.toml) |
| 技能定义 | skills/ (75 SKILL.md) |
| Pipeline 模板 | crates/zclaw-pipeline/templates/ (17 YAML) |
| 组件目录 | desktop/src/components/ (~53 组件) |
| 系统真实状态 | docs/TRUTH.md |
8. 风险与缓解
| 风险 | 概率 | 影响 | 缓解措施 |
|---|---|---|---|
| 模型 API 不稳定 | 高 | 测试轮次浪费 | 准备备用模型,Kimi 挂了切 GLM |
| 配额提前耗尽 | 高 | 无法完成测试 | Admin 预充值、准备多个测试账号 |
| Kimi ENTITY bug | 中 | 角色A数据被污染 | 测到即标注,不影响其他角色 |
| 底层 P0 阻塞 | 低 | 全部测试暂停 | Phase 1 先验证基础,尽早暴露 |
| Browser Hand 失败 | 高 | 11 个 browser 命令不可测 | 若 Fantoccini 未安装则标注 KNOWN 并跳过,不阻塞发布;若已安装则只测试简单导航(打开URL+截图),不测试复杂表单填写 |