docs: add Tauri functional test report with P0-P2 findings
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

This commit is contained in:
iven
2026-04-05 22:03:14 +08:00
parent b5993d4f43
commit f9e1ce1d6e

View File

@@ -0,0 +1,316 @@
# ZCLAW Tauri 端功能测试报告
**日期:** 2026-04-05
**测试环境:** Windows 11, Tauri 2.x, React 19, pnpm start:dev
**测试方法:** UI 交互 + JS 注入探针 + localStorage/Store 数据验证
**测试人员:** Claude (自动化)
---
## 测试总结
| 模块 | 状态 | P0 | P1 | P2 | 备注 |
|------|------|----|----|-----|------|
| T1 聊天核心 | ⚠️ 部分通过 | 1 | 0 | 0 | LLM 500 错误导致消息发送失败 |
| T2 会话管理 | ⚠️ 部分通过 | 0 | 1 | 0 | 消息持久化位置不明 |
| T3 Agent 人格 | ⚠️ 部分通过 | 0 | 1 | 0 | 侧边栏切换 Bug |
| T4 记忆系统 | ⚠️ 部分通过 | 0 | 0 | 1 | 记忆去重缺失 |
| T5 自动化 | ✅ 通过 | 0 | 0 | 1 | 审计日志单一 |
| T6 技能市场 | ✅ 通过 | 0 | 0 | 0 | 12 个技能正常 |
| 登录系统 | ✅ 通过 | 0 | 0 | 0 | SaaS 登录正常 |
| **总计** | | **1** | **2** | **2** | |
---
## 详细测试结果
### 登录系统 ✅ 通过
**测试操作:**
1. 启动应用后显示 SaaS 登录页面(用户名/密码表单)
2. 输入 `admin / admin123`,点击登录
3. 登录成功,跳转到主聊天界面
**验证结果:**
- [x] 登录页面正常渲染表单、按钮、Logo
- [x] 用户名密码输入正常
- [x] SaaS 后端8080 端口)响应正常
- [x] 登录成功后 `isLoggedIn` 状态更新
- [x] Cookie/Token 持久化到 localStorage加密存储 `enc_zclaw-saas-token`
- [x] 会话恢复机制(`restoreSession`)存在
**状态数据:**
```json
{
"connectionMode": "saas",
"saasUrl": "http://127.0.0.1:8080",
"username": "admin",
"tokenStorage": "encrypted (AES)"
}
```
---
### T1: 聊天核心功能 ⚠️ 部分通过 (P0 x1)
**测试操作:**
1. 在 textarea 中输入测试消息
2. 通过 React nativeInputValueSetter 设置值并触发 input/change 事件
3. 点击发送按钮aria-label="发送消息"
4. 等待 LLM 流式响应
**验证结果:**
- [x] Textarea 输入框正常渲染placeholder "今天我能为你做些什么?"
- [x] React 受控组件输入正常(需用 nativeInputValueSetter
- [x] 发送按钮在空输入时 disabled有内容时 enabled
- [x] 消息发送后 textarea 自动清空
- [x] 思考模式Thinking已启用
- [x] 当前模型显示: `glm-4-flash`
- [ ] **P0: LLM 响应 500 错误** — 发送消息后收到 `API error 500 Internal Server Error: {"error":"INTERNAL_ERROR","message":"服务内部错误"}`
- [x] 历史消息中有成功回复("收到"),说明 LLM 调用链路本身是通的
**LLM 调用链路:**
```
用户输入 → KernelClient → SaaS Relay (8080) → GLM API → 流式响应
```
**错误日志:**
```
[KernelClient] Stream error: LLM error: API error 500 Internal Server Error
```
**流式存储状态:**
```json
{ "chatMode": "thinking" }
```
---
### T2: 会话管理 ⚠️ 部分通过 (P1 x1)
**测试操作:**
1. 查看侧边栏对话列表
2. 检查 localStorage 中的对话存储
**验证结果:**
- [x] 侧边栏显示对话列表("你叫什么名字 — 2小时前5条消息"
- [x] 对话搜索框存在placeholder "搜索对话..."
- [x] "新对话" 按钮存在2个位置顶部和主内容区
- [ ] **P1: 消息持久化位置不明**`zclaw-chat-storage``{state:{}, version:0}`,但页面上能看到历史消息
- 消息可能存储在 IndexedDB 或内存中
- 刷新页面后消息是否能恢复未验证
**存储数据:**
```json
{
"zclaw-chat-storage": "{\"state\":{},\"version\":0}",
"zclaw-stream-storage": "{\"state\":{\"chatMode\":\"thinking\"}}"
}
```
---
### T3: Agent 人格系统 ⚠️ 部分通过 (P1 x1)
**测试操作:**
1. 检查 localStorage 中 Agent 身份数据
2. 点击侧边栏"智能体"按钮
3. 验证 CloneManager 组件是否渲染
**验证结果:**
- [x] 5 个 Agent 身份存储在 `zclaw-agent-identities`
- [x] 每个 Agent 有完整的三件套: `soul` + `instructions` + `userProfile`
- [x] Soul 内容完整ZCLAW 人格定义,含核心特质和语气)
- [x] Instructions 完整(操作规范、记忆管理)
- [x] UserProfile 初始状态:"尚未收集到用户偏好信息"
- [ ] **P1: 侧边栏 "智能体" tab 切换失效** — 点击"智能体"按钮后:
- 按钮样式变为 activefont-medium class 已添加)
- 但内容区仍显示 ConversationList 而不是 CloneManager
- `activeTab` 状态确实切换到了 'clones'(通过按钮样式确认)
- **根因**: AnimatePresence mode="wait" 可能导致渲染问题,或 CloneManager 组件渲染失败
**Soul 内容示例:**
```markdown
# ZCLAW 人格
你是 ZCLAW小龙虾一个基于 OpenClaw 定制的中文 AI 助手。
## 核心特质
- **高效执行**: 你不只是出主意,你会真正动手完成任务
- **中文优先**: 默认使用中文交流,必要时切换英文
- **专业可靠**: 对技术问题给出精确答案,不确定时坦诚说明
- **持续成长**: 你会记住与用户的交互,不断改进自己的服务方式
## 语气
简洁、专业、友好。避免过度客套,直接给出有用信息。
```
**问题:**
- 所有 5 个 Agent 共享相同的 Soul 模板(没有个性化差异)
- 新创建的 Agent 没有独特的 personality/communicationStyle 设置
---
### T4: 记忆系统 ⚠️ 部分通过 (P2 x1)
**测试操作:**
1. 检查 `zclaw-intelligence-fallback`(本地降级记忆)
2. 检查 `zclaw-agent-memories`Agent 记忆)
3. 检查 `zclaw-memory-stats`(记忆统计)
4. 检查 `zclaw-memory-graph`(记忆图谱过滤器)
**验证结果:**
- [x] Fallback 记忆: 4 条,存储在 localStorage
- [x] Agent 记忆: 3 条任务类型记忆
- [x] 记忆统计: 4 entries, 1337 bytes
- [x] 记忆图谱过滤器支持 5 种类型: fact/preference/lesson/context/task
- [x] 记忆图谱有 minImportance 和 dateRange 过滤
- [ ] **P2: 记忆去重缺失** — 同一内容 "用户偏好: 不用进行人格设置么" 重复存储 4 次ID 不同)
- 时间戳递增说明是多次独立写入
- 缺少基于内容的去重检查
**记忆数据:**
```
Fallback 记忆 (4条):
- mem_...a0s5z9: "用户偏好: 不用进行人格设置么" (preference)
- mem_...pbx96r: "用户偏好: 不用进行人格设置么" (preference) ← 重复
- mem_...q6rqwo: "用户偏好: 不用进行人格设置么" (preference) ← 重复
- mem_...u8mger: "用户偏好: 不用进行人格设置么" (preference) ← 重复
Agent 记忆 (3条):
- "帮我起草一份产品需求文档" (task)
- "帮我写一个 Python 脚本处理 Excel 文件" (task)
- "帮我梳理服饰公司的业务SOP" (task)
```
---
### T5: 自动化系统 ✅ 通过 (P2 x1)
**测试操作:**
1. 检查自主配置(`zclaw-autonomy-config`
2. 检查反思引擎(`zclaw-reflection-*`
3. 检查心跳系统(`zclaw-heartbeat-*`
4. 检查审计日志(`zclaw-autonomy-audit-log`
5. 点击"自动化"按钮,验证 Pipeline 列表
**验证结果:**
- [x] 自主等级: `autonomous`(最高级别)
- [x] 所有自主操作均已启用:
- memoryAutoSave: true
- identityAutoUpdate: true
- skillAutoInstall: true
- selfModification: true
- autoCompaction: true
- autoReflection: true
- [x] 反思引擎配置完整:
- 每 5 次对话触发
- 允许修改 Soul
- 需要用户批准
- 支持 LLM 增强分析
- [x] 反思历史: 8 条记录
- [x] 反思状态: 距上次反思已过 2 次对话
- [x] 心跳系统: 已启用30 分钟间隔3 个检查项
- 待办任务检查
- 记忆健康检查
- 空闲问候
- [x] Pipeline 模板: 15 个,支持 7 个行业分类
- [x] 自动化面板 UI 渲染正常Pipeline/Hands/Workflows 三个标签)
- [ ] **P2: 审计日志单一** — 6 条日志全部是 `reflection_run`,没有 Hands 触发或技能执行记录
- 可能是因为没有触发过 Hands
- 也可能是审计日志记录不完整
**Prompt Cache 验证:**
```
已缓存 3 个 prompt 模板:
- reflection: 反思引擎系统提示
- compaction: 上下文压缩提示
- extraction: 记忆提取提示
```
---
### T6: 技能市场 ✅ 通过
**测试操作:**
1. 检查 `zclaw-skill-index` 数据
2. 点击"技能市场"按钮
**验证结果:**
- [x] 12 个技能已安装
- [x] 覆盖 8 个分类
- [x] 每个技能有 5-6 个触发器
- [x] 技能列表:
| 技能 | 分类 | 触发器数 |
|------|------|----------|
| Code Review | development | 5 |
| Frontend Developer | development | 6 |
| Backend Architect | development | 5 |
| Security Engineer | security | 5 |
| Data Analysis | analytics | 5 |
| Chinese Writing | content | 5 |
| DevOps Automator | ops | 6 |
| Senior PM | management | 5 |
| Git Operations | development | 6 |
| API Tester | testing | 5 |
| Finance Tracker | business | 5 |
| Social Media Strategist | marketing | 6 |
---
## 额外发现
### 环境信息
| 项目 | 值 |
|------|-----|
| 运行时 | Tauri (桌面端) |
| 连接模式 | SaaS relay |
| SaaS 后端 | http://127.0.0.1:8080 (运行中) |
| Dev Server | 端口 50051 (未监听) |
| MCP 插件 | 端口 4000 (未监听) |
| 当前模型 | glm-4-flash |
| 用户 | admin |
### 已知但未测试的功能
- [ ] 新建对话流程(点击"新对话"后的完整流程)
- [ ] 切换对话(点击侧边栏不同对话)
- [ ] 删除对话
- [ ] 创建新 Agent因 CloneManager 未渲染无法测试)
- [ ] Agent 人格编辑
- [ ] 记忆搜索功能
- [ ] Pipeline 运行
- [ ] Hand 触发执行
- [ ] 技能安装/卸载
- [ ] 模型切换(点击 glm-4-flash 按钮)
### Dev Server 端口 50051 问题
`dev-server` feature 已添加到 `tauri:dev` 命令(本次测试中修改了 `desktop/package.json`),但重启后 50051 端口仍未监听。可能原因:
1. Cargo 需要重新编译才能识别新 feature增量编译可能跳过
2. `dev_server::start_dev_server()` 可能在绑定端口时失败但静默吞掉了错误
3. 需要完全重新构建:`cargo clean && pnpm start:dev`
---
## 缺陷清单
### P0 (阻塞性)
| ID | 模块 | 描述 | 复现步骤 |
|----|------|------|----------|
| P0-1 | T1 聊天 | SaaS relay 模式下 glm-4-flash 偶发 500 错误 | 发送消息后 LLM 返回 INTERNAL_ERROR |
### P1 (严重)
| ID | 模块 | 描述 | 复现步骤 |
|----|------|------|----------|
| P1-1 | T3 Agent | 侧边栏"智能体"tab 切换后内容区不更新 | 点击"智能体"按钮 → 内容区仍显示对话列表 |
| P1-2 | T2 会话 | 消息持久化位置不明确 | 检查 zclaw-chat-storage 为空,但页面有历史消息 |
### P2 (一般)
| ID | 模块 | 描述 | 复现步骤 |
|----|------|------|----------|
| P2-1 | T4 记忆 | 记忆写入无去重 | 多次对话产生相同内容的重复记忆 |
| P2-2 | T5 自动化 | 审计日志仅记录反思运行 | 无 Hands/技能执行日志 |