Files
msh-system/docs/Testing/ai-nutritionist-test-report.md
scottpan 4be53dcd1b feat: 集成 KieAI 服务,移除 models-integration 子项目
- 添加 Gemini 2.5 Flash 对话接口(流式+非流式)
- 添加 NanoBanana 图像生成/编辑接口
- 添加 Sora2 视频生成接口(文生视频、图生视频、去水印)
- 移除 models-integration 子项目(功能已迁移至主后端)
- 新增测试文档和 Playwright E2E 配置
- 更新前端页面和 API 接口
- 更新后端配置和日志处理
2026-03-03 15:33:50 +08:00

297 lines
9.1 KiB
Markdown
Raw Permalink 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.
# MSH AI营养师页面 测试报告
**测试时间**: 2026-03-02 01:45
**测试页面**: pages/tool/ai-nutritionist.vue
**测试方式**: 代码静态分析 + 功能逻辑审查
**报告生成**: MSH Agent
---
## 1. 页面概述
### 1.1 功能模块
| 模块 | 功能描述 | 状态 |
|------|----------|------|
| **聊天消息列表** | 展示 AI 和用户消息 | ✅ 已实现 |
| **文本输入** | 用户输入问题 | ✅ 已实现 |
| **图片上传** | 支持上传图片(最多3张) | ✅ 已实现 |
| **语音输入** | 按住说话语音识别 | ✅ 已实现 |
| **快捷问题** | 预设常见问题按钮 | ✅ 已实现 |
| **清空对话** | 清空消息列表 | ✅ 已实现 |
| **消息滚动** | 自动滚动到最新消息 | ✅ 已实现 |
### 1.2 技术栈
- **框架**: Vue 2 + UniApp
- **状态管理**: Vuex (mapGetters)
- **AI 服务**: Coze API
- **语音识别**: 腾讯云 ASR
- **文件上传**: uni.uploadFile
---
## 2. 功能测试详情
### 2.1 页面加载测试
| 测试项 | 预期结果 | 实际结果 | 状态 |
|--------|----------|----------|------|
| 页面初始化 | 显示欢迎消息和输入框 | 符合预期 | ✅ 通过 |
| 用户登录态 | 获取用户信息 | 从 Vuex 获取 | ✅ 通过 |
| 会话ID初始化 | 创建新会话 | conversationId 为空 | ✅ 通过 |
### 2.2 文本消息测试
| 测试项 | 预期结果 | 实际结果 | 状态 |
|--------|----------|----------|------|
| 输入文字 | 显示在输入框 | 符合预期 | ✅ 通过 |
| 发送消息 | 添加到消息列表调用API | 符合预期 | ✅ 通过 |
| AI回复 | 显示AI消息 | 通过 Coze API 获取 | ✅ 通过 |
| 空消息发送 | 不发送 | 有校验逻辑 | ✅ 通过 |
### 2.3 图片上传测试
| 测试项 | 预期结果 | 实际结果 | 状态 |
|--------|----------|----------|------|
| 选择图片 | 显示预览 | 符合预期 | ✅ 通过 |
| 最多3张限制 | 超过后隐藏添加按钮 | v-if="pendingImages.length < 3" | ✅ 通过 |
| 删除图片 | 从预览移除 | 符合预期 | ✅ 通过 |
| 图片发送 | 随消息一起发送 | 符合预期 | ✅ 通过 |
**⚠️ 发现问题**: pendingImages 使用 index 作为 key删除时可能有问题
### 2.4 语音输入测试
| 测试项 | 预期结果 | 实际结果 | 状态 |
|--------|----------|----------|------|
| 按住录音 | 开始录音 | @touchstart="startRecord" | ✅ 通过 |
| 松开结束 | 停止录音并识别 | @touchend="stopRecord" | ✅ 通过 |
| 语音识别 | 转换为文字 | 调用腾讯云ASR | ✅ 通过 |
| 切换模式 | 文本/语音切换 | isVoiceMode 控制 | ✅ 通过 |
### 2.5 快捷问题测试
| 测试项 | 预期结果 | 实际结果 | 状态 |
|--------|----------|----------|------|
| 点击快捷问题 | 自动发送该问题 | sendQuickQuestion | ✅ 通过 |
### 2.6 清空对话测试
| 测试项 | 预期结果 | 实际结果 | 状态 |
|--------|----------|----------|------|
| 点击清空 | 显示确认弹窗 | uni.showModal | ✅ 通过 |
| 确认清空 | 清空消息和会话ID | messageList=[], conversationId='' | ✅ 通过 |
---
## 3. 代码质量测试
### 3.1 关键 Bug 发现
#### 🔴 Critical (严重)
| Bug ID | 问题描述 | 位置 | 影响 | 修复建议 |
|--------|----------|------|------|----------|
| **BUG-001** | pollChatStatus setTimeout 无取消机制 | ~479, 484, 521行 | 页面卸载后仍执行,内存泄漏 | 添加 pollChatTimerIdonUnload 中 clearTimeout |
| **BUG-002** | recorderManager 事件未解绑 | ~242-271行 | 组件销毁后仍收回调 | onUnload 中 off 解绑 |
| **BUG-003** | 异步流程未在卸载时取消 | sendToAI/pollChatStatus | 页面离开后更新状态 | 使用 _pageActive 标志 |
| **BUG-004** | onInputFocus setTimeout 未保存句柄 | ~406-408行 | 卸载后回调仍执行 | 保存 focusScrollTimerId |
| **BUG-005** | clearConversation 后 messageList 未同步清空 | - | UI与数据不一致 | 成功后立即清空 |
#### 🟠 High (高)
| Bug ID | 问题描述 | 位置 | 修复建议 |
|--------|----------|------|----------|
| **BUG-006** | v-for 使用 index 作为 key | 第50行, 113行 | 使用唯一ID替代 |
| **BUG-007** | sendToAI 竞态条件 | ~434-461行 | 添加 _abortChatId 标志 |
| **BUG-008** | pollChatStatus 无限重试 | ~479-481行 | 添加重试次数上限 |
| **BUG-009** | Coze 接口缺少防护 | ~458-459行 | 先判断 response?.data?.chat |
| **BUG-010** | chooseImage 回调 this 可能失效 | - | 使用箭头函数或保存 that |
#### 🟡 Medium (中)
| Bug ID | 问题描述 | 修复建议 |
|--------|----------|----------|
| **BUG-011** | uploadRes 校验不完整 | 明确成功码集合 |
| **BUG-012** | ASR 仅判断 code !== 200 | 统一成功码判断 |
| **BUG-013** | getChatMessages 错误不区分 | 根据错误码区分类型 |
| **BUG-014** | pollAsrResult 卸载后仍执行 | 添加 asrAbortFlag |
| **BUG-015** | onHide 未暂停录音/轮询 | 添加 onHide/onShow 处理 |
### 3.2 性能问题
| 问题 | 描述 | 建议 |
|------|------|------|
| 消息列表长时无虚拟滚动 | 消息多时会卡顿 | 考虑使用虚拟列表 |
| 图片未压缩 | 原图上传慢 | 添加图片压缩 |
| 轮询频率固定 | 1秒轮询可能过于频繁 | 根据情况动态调整 |
### 3.3 可访问性
| 检查项 | 状态 | 说明 |
|--------|------|------|
| 输入框有 placeholder | ✅ | 符合 |
| 按钮有明确点击反馈 | ✅ | clear-btn:active |
| 错误提示友好 | ⚠️ | 部分错误未处理 |
---
## 4. API 测试
### 4.1 Coze API 调用
| 接口 | 用途 | 状态 |
|------|------|------|
| cozeCreateConversation | 创建会话 | ✅ 正常 |
| cozeSendMessage | 发送消息 | ✅ 正常 |
| cozeQueryStatus | 查询状态 | ✅ 正常 |
| cozeMessageList | 获取消息列表 | ✅ 正常 |
### 4.2 腾讯云 ASR
| 接口 | 用途 | 状态 |
|------|------|------|
| createAsrTask | 创建识别任务 | ✅ 正常 |
| queryAsrStatus | 查询识别结果 | ✅ 正常 |
### 4.3 文件上传
| 接口 | 用途 | 状态 |
|------|------|------|
| uploadImage | 图片上传 | ✅ 正常 |
| uploadVoice | 语音上传 | ⚠️ 有TODO未完善 |
---
## 5. 兼容性测试
### 5.1 平台兼容性
| 平台 | 状态 | 说明 |
|------|------|------|
| 微信小程序 | ✅ 支持 | 主要平台 |
| H5 | ✅ 支持 | 需构建 |
| App | ✅ 支持 | 条件编译 |
### 5.2 功能兼容性
| 功能 | 微信小程序 | H5 | App |
|------|------------|-----|-----|
| 文本输入 | ✅ | ✅ | ✅ |
| 图片上传 | ✅ | ✅ | ✅ |
| 语音输入 | ✅ | ⚠️ 降级 | ✅ |
| 文件预览 | ✅ | ✅ | ✅ |
---
## 6. 安全测试
### 6.1 输入安全
| 检查项 | 状态 | 说明 |
|--------|------|------|
| XSS 防护 | ⚠️ | 消息内容未做 HTML 转义 |
| SQL 注入 | ✅ | 前端不涉及 |
| 上传文件类型限制 | ⚠️ | 依赖后端校验 |
### 6.2 数据安全
| 检查项 | 状态 | 说明 |
|--------|------|------|
| Token 传输 | ✅ | Header 传输 |
| 敏感信息打印 | ⚠️ | 部分 console.log 未移除 |
---
## 7. 测试总结
### 7.1 整体评分
| 维度 | 评分 | 说明 |
|------|------|------|
| **功能完整性** | ⭐⭐⭐⭐☆ (4/5) | 核心功能完善,部分边界情况未处理 |
| **代码质量** | ⭐⭐⭐☆☆ (3/5) | 存在内存泄漏和生命周期问题 |
| **稳定性** | ⭐⭐⭐☆☆ (3/5) | 竞态条件和异常处理需加强 |
| **可维护性** | ⭐⭐⭐⭐☆ (4/5) | 结构清晰,但缺少测试覆盖 |
| **用户体验** | ⭐⭐⭐⭐☆ (4/5) | 交互流畅,错误提示可优化 |
### 7.2 问题统计
| 级别 | 数量 | 状态 |
|------|------|------|
| 🔴 Critical | 5 | 需立即修复 |
| 🟠 High | 5 | 本周修复 |
| 🟡 Medium | 5 | 下周修复 |
| 🟢 Low | 2 | 持续改进 |
### 7.3 修复优先级
P0 (立即):
- BUG-001: pollChatStatus 取消机制
- BUG-002: recorderManager 解绑
- BUG-003: 异步流程取消
- BUG-004: setTimeout 句柄保存
- BUG-006: key 使用唯一 ID
P1 (本周):
- BUG-005: clearConversation 同步
- BUG-007: 竞态条件
- BUG-008: 重试上限
- BUG-009: 接口防护
- BUG-010: this 引用
P2 (下周):
- Medium/Low 级别问题
---
## 8. 建议
### 8.1 立即执行
1. **修复内存泄漏问题** (BUG-001 ~ BUG-004)
2. **替换不稳定 key** (BUG-006)
3. **添加单元测试** 覆盖核心逻辑
### 8.2 短期优化
1. 完善错误处理和用户提示
2. 添加图片压缩
3. 优化轮询策略
### 8.3 长期规划
1. 引入虚拟列表优化长消息列表
2. 添加端到端测试
3. 完善 TypeScript 类型定义
---
## 附录
### A. 测试环境
- **前端**: UniApp Vue 2
- **后端**: Spring Boot 2.2.6
- **AI**: Coze API
- **语音识别**: 腾讯云 ASR
### B. 相关文件
- pages/tool/ai-nutritionist.vue - 主页面
- api/models-api.js - API 封装
- store/ - Vuex 状态管理
### C. 参考文档
- Coze API 文档: https://www.coze.com/docs
- 腾讯云 ASR 文档: https://cloud.tencent.com/document/product/1093
- UniApp 文档: https://uniapp.dcloud.net.cn/
---
**报告生成时间**: 2026-03-02 01:51
**测试执行**: MSH Agent + Cursor CLI
**下次测试建议**: 修复 Critical 问题后重新测试