# 小程序功能测试报告 > 测试工具: weapp-local MCP | 环境: 微信开发者工具, iPhone 12/13 Pro 模拟器 > iOS 10.0.1, 390×844 | 分支: feat/media-library-banner ## 1. 连接与认证 | 项目 | 结果 | 说明 | |------|------|------| | MCP 连接 | PASS | ws://localhost:9420 连接成功 | | inject_auth | PASS_WITH_ISSUES | 报告"注入成功"但存在集成问题(C-01) | | Auth 手动恢复 | PASS | 通过 `__hms` bridge 手动 restoreAuth 成功 | ## 2. Tab 页面测试 ### 2.1 首页 (pages/index/index) — PASS | 检查项 | 结果 | 详情 | |--------|------|------| | 问候语 | PASS | "晚上好,系统管理员" + "5月21日周四" | | 消息铃铛 | PASS | 可点击 | | 签到卡片 | PASS | 进度环 0%,4 个 capsule(血压/心率/血糖/体重) | | 今日体征 | PASS | 4 张卡片,值"---",标签"未记录" | | 操作按钮 | PASS | "记录体征" + "预约挂号" | | SOS 按钮 | PASS | 存在 | | 访客模式 | PASS | 未登录显示轮播图 + 健康资讯 + 注册 CTA | | Console 错误 | PASS | 无 | ### 2.2 健康 Tab (pages/health/index) — PASS_WITH_ISSUES | 检查项 | 结果 | 详情 | |--------|------|------| | 页面加载 | PASS | 分段选项卡(血压/心率/血糖/体重) | | 录入表单 | PASS | 收缩压+舒张压输入框 + 参考范围提示 | | 趋势图 | PASS | 空状态"暂无趋势数据"正确显示 | | **保存功能** | **FAIL** | 日志 `[health] 保存体征数据失败: {}`(C-01) | ### 2.3 助手 Tab / AI 聊天 (pages/messages/index) — PASS | 检查项 | 结果 | 详情 | |--------|------|------| | 页面加载 | PASS | 标题"健康助手 . 小华" | | 在线状态 | PASS | 绿色圆点 + "24小时在线" | | 输入框 | PASS | placeholder "输入您的问题..." | | 发送按钮 | PASS | 存在,无输入时 disabled | ### 2.4 我的 Tab (pages/profile/index) — PASS | 检查项 | 结果 | 详情 | |--------|------|------| | 用户卡片 | PASS | 头像"系" + "系统管理员" | | 统计数据 | PASS | 健康积分 0 + 连续打卡 0 天 | | 功能菜单 | PASS | 5 大分组 17 个菜单项完整 | | 退出登录 | PASS | 红色按钮存在 | | Console 错误 | PASS | 无 | ### 2.5 商城 Tab — 不在 TabBar 内,需导航访问 ## 3. 非 Tab 页面测试 ### 3.1 积分商城 (pages/mall/index) — PASS_WITH_ISSUES | 检查项 | 结果 | 详情 | |--------|------|------| | 页面加载 | PASS | 积分头部 + 签到按钮 | | 空状态 | PASS | "暂无商品" + "更多好物即将上架" | | **签到功能** | **FAIL** | 日志 `[points] 签到失败: {}`(C-01) | ### 3.2 咨询列表 (pages/consultation/index) — PASS_WITH_ISSUES | 检查项 | 结果 | 详情 | |--------|------|------| | 页面导航 | PASS | 成功导航 | | 骨架屏 | PASS | 4 个 loading card | | **数据加载** | **FAIL** | 永久 loading 状态,无超时提示(C-01 + BUG-03) | ## 4. 核心功能 API 验证(绕过小程序 request 层) | API | 方法 | 结果 | 详情 | |-----|------|------|------| | 积分账户 | GET /health/points/account | **PASS** | 余额 40,总获得 50,总消费 10 | | 血压保存 | POST /health/patients/{id}/vital-signs | **PASS** | 200,返回完整记录 | | 每日签到 | POST /health/points/checkin | **PASS** | 200,checked_in_today=true,连续 2 天 | | 咨询列表 | GET /health/consultation-sessions | **PASS** | 200,1 条 active 会话 | **结论:** 后端 API 全部正常,所有功能性问题源于小程序端 token 读取。 ## 5. BUG 详细分析 ### C-01: inject_auth 与 request.ts 的 storage 键不匹配 - **严重性:** CRITICAL - **文件:** `services/request.ts:23-29` - **现象:** `inject_auth` 写入明文键(`access_token`),`request.ts` 的 `safeGet()` 只调用 `secureGet()`(读 `_es_` 前缀加密键),不 fallback 到明文键 - **根因:** `safeGet` 在 `secureGet` 返回空字符串时不 fallback(空字符串不抛异常,只在 catch 中 fallback)。而 `auth.ts` 的 `storageGet` 在 `secureGet` 返回 falsy 时正确 fallback - **影响:** 所有需要认证的功能不可用(体征保存、签到、咨询、数据加载) - **修复:** 统一 `safeGet` 和 `storageGet` 的 fallback 逻辑,或让 `inject_auth` 写入加密键 - **预计工时:** 1h ### C-02: secure-storage.ts UTF-16 截断中文字符 - **严重性:** CRITICAL - **文件:** `utils/secure-storage.ts:13-23` - **现象:** `toBase64` 使用 `Uint8Array` 截断 UTF-16 高位字节 - **根因:** `charCodeAt` 返回的 UTF-16 编码值超过 255 时被截断为 8 位 - **影响:** 任何含中文的数据(如 `display_name`="系统管理员")经 encrypt-decrypt 循环后损坏,`JSON.parse` 失败 - **修复:** 使用 `TextEncoder`/`TextDecoder` 进行 UTF-8 编解码 - **预计工时:** 2h ### BUG-03: 咨询列表无超时处理 - **严重性:** MEDIUM - **文件:** `pages/consultation/index` - **现象:** API 失败时无用户反馈,页面永远显示骨架屏 - **修复:** 添加加载超时和错误状态 UI - **预计工时:** 1h ### BUG-04: 错误日志输出空对象 - **严重性:** MEDIUM - **现象:** 签到/体征保存失败时 `catch` 输出 `{}` - **修复:** 使用 `JSON.stringify(err, Object.getOwnPropertyNames(err))` 输出完整错误 - **预计工时:** 30min ## 6. 测试统计 | 类别 | 测试项 | PASS | FAIL | PASS_WITH_ISSUES | |------|--------|------|------|------------------| | 连接与认证 | 3 | 1 | 0 | 2 | | Tab 页面 | 4 | 3 | 0 | 1 | | 非 Tab 页面 | 2 | 0 | 0 | 2 | | UI 元素 | 38 | 38 | 0 | 0 | | 核心功能(API 直测) | 4 | 4 | 0 | 0 | | 核心功能(应用内) | 3 | 0 | 3 | 0 | | **合计** | **54** | **46** | **3** | **5** | **UI 渲染通过率:** 100% (38/38) **API 直测通过率:** 100% (4/4) **应用内功能通过率:** 0% (0/3) — 全部因 C-01 失败 **综合通过率:** 85.2% (46/54) ## 7. 评价 **UI 层质量:** 优秀(A 级)— 所有页面正确渲染,空状态处理完善,设计系统一致性好。 **功能层质量:** 失败(F 级)— 但根因集中在一个 CRITICAL 问题(C-01 token 读取),修复后预计 100% 通过。后端 API 经独立验证全部正常。