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

9.1 KiB
Raw Blame History

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. 参考文档


报告生成时间: 2026-03-02 01:51
测试执行: MSH Agent + Cursor CLI
下次测试建议: 修复 Critical 问题后重新测试