根因:主包 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
147 lines
6.1 KiB
Markdown
147 lines
6.1 KiB
Markdown
# 小程序功能测试报告
|
||
|
||
> 测试工具: 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 经独立验证全部正常。
|