Files
hms/docs/audits/v3-beta/04-miniprogram.md
iven 1e59007bd5 fix(mp): DevTools 卡死 + 主包 2MB→766KB + 代码质量 4 项全通过
根因:主包 2MB 全量组件注入导致 DevTools 渲染引擎内存渐增,
叠加离线时固定 3s 抑制期后的请求洪泛。

修复:
- app.config.ts 添加 lazyCodeLoading: requiredComponents
  主包 2.0MB→766KB,taro.js 526→131KB,vendors.js 230→28KB
- request.ts 离线抑制改为指数退避(3s→6s→12s→30s cap)
  后端不可达时自动延长抑制,防止请求风暴
- SegmentTabs Tab 接口改为 readonly,修复 TS 编译错误
- AbortController polyfill 补齐小程序运行时缺失
- 健康首页/设备同步/健康档案/报告/设置页 UI 重构
- 文章页公开端点适配游客访问
- 健康首页 Swiper 间隔优化 4s→5s,动画 500→300ms
2026-05-24 11:32:40 +08:00

6.1 KiB
Raw Blame History

小程序功能测试报告

测试工具: 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 200checked_in_today=true连续 2 天
咨询列表 GET /health/consultation-sessions PASS 2001 条 active 会话

结论: 后端 API 全部正常,所有功能性问题源于小程序端 token 读取。

5. BUG 详细分析

C-01: inject_auth 与 request.ts 的 storage 键不匹配

  • 严重性: CRITICAL
  • 文件: services/request.ts:23-29
  • 现象: inject_auth 写入明文键(access_tokenrequest.tssafeGet() 只调用 secureGet()(读 _es_ 前缀加密键),不 fallback 到明文键
  • 根因: safeGetsecureGet 返回空字符串时不 fallback空字符串不抛异常只在 catch 中 fallback。而 auth.tsstorageGetsecureGet 返回 falsy 时正确 fallback
  • 影响: 所有需要认证的功能不可用(体征保存、签到、咨询、数据加载)
  • 修复: 统一 safeGetstorageGet 的 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 经独立验证全部正常。