Files
hms/docs/qa/e2e-test-report-2026-05-15.md

283 lines
12 KiB
Markdown
Raw 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.
# HMS 全链路端到端测试报告
> **测试日期:** 2026-05-15
> **测试分支:** feat/media-library-banner
> **测试人员:** Claude (自动化 + 手动混合)
> **环境:** Win11 / PostgreSQL 16 / 后端 :3000 / 前端 :5174 / 微信开发者工具
---
## 一、测试概览
### 1.1 测试范围
| 维度 | 覆盖内容 |
|------|----------|
| 后端 API | 260+ 端点,覆盖 15 个核心业务模块 |
| Web 前端 | 29 个活跃路由页面(患者/预约/医护/排班/随访/咨询/文章/媒体库/轮播图/积分/告警等) |
| 微信小程序 | 14 个核心页面(首页/健康/预约/咨询/商城/消息/体征/趋势/告警/监测/医生端等) |
| 跨端同步 | Web ↔ 小程序数据一致性 |
| 安全/边界 | SQL 注入、XSS、权限控制、乐观锁、异常输入、Token 过期 |
### 1.2 测试结果总览
| 指标 | 值 |
|------|-----|
| 测试用例总数 | **156** |
| PASS | **118** (75.6%) |
| PASS_WITH_ISSUES | **14** (9.0%) |
| FAIL | **24** (15.4%) |
| 发现 BUG 总数 | **28** |
| CRITICAL | **4** |
| HIGH | **6** |
| MEDIUM | **10** |
| LOW | **8** |
### 1.3 平台通过率
| 平台 | 通过率 | 备注 |
|------|--------|------|
| 后端 API | **92%** | 核心业务流全部通过,边界条件有少量缺陷 |
| Web 前端 | **70%** | 侧边栏路由不稳定导致多项 FAIL |
| 微信小程序 | **93%** | 14 页面全部加载正常MCP 工具链有限制 |
| 安全验证 | **85%** | SQL注入/XSS/Token验证全部通过超长输入有缺陷 |
| 跨端同步 | **80%** | 患者数据同步正常部分API路径不匹配 |
---
## 二、BUG 清单
### 2.1 CRITICAL严重— 4 个
| ID | 模块 | 症状 | 根因 |
|----|------|------|------|
| BUG-CR-01 | Web 侧边栏 | 点击侧边栏菜单后 URL 变更但页面不刷新,约 50% 复现率 | React Router 与侧边栏菜单组件联动问题 |
| BUG-CR-02 | Web 轮播图 | 轮播图列表缩略图全部显示为灰色占位符 | `BannerManage.tsx` 未调用 `resolveMediaUrl()`,且路径含 Windows 反斜杠 |
| BUG-CR-03 | 后端 患者 | 500 字符超长名称导致后端 500 Internal Server Error | 患者姓名长度未做后端校验,应返回 400 |
| BUG-CR-04 | 后端 侧边栏 | 侧边栏导航页面内容不刷新(影响全站导航) | 可能是 React Router key 变化未触发组件重渲染 |
### 2.2 HIGH— 6 个
| ID | 模块 | 症状 | 根因 |
|----|------|------|------|
| BUG-HI-01 | Web 排班 | 排班页面路由被冻结 (`frozen: true`),完全不可访问 | `routeConfig.ts:236-239` 排班标记为冻结但功能已开发 |
| BUG-HI-02 | Web 轮播图 | 轮播图启用/禁用 Switch 切换无效 | `handleToggleStatus` 使用过时的 version409 被静默吞掉 |
| BUG-HI-03 | Web 医护 | 多条医护记录中文名乱码Unicode 损坏) | 测试数据写入时编码损坏 |
| BUG-HI-04 | 后端 健康数据 | POST `/health/health-data` 返回 404 | API 路径可能为 `/health/vital-signs` 而非 `/health/health-data` |
| BUG-HI-05 | 后端 随访 | POST `/health/follow-up-records` 返回 405 | 端点路径不匹配 |
| BUG-HI-06 | 后端 公开端点 | 轮播图和文章公开端点返回 401 "未授权" | 公开端点可能需要 JWT 或路由注册有误 |
### 2.3 MEDIUM— 10 个
| ID | 模块 | 症状 |
|----|------|------|
| BUG-MD-01 | Web 预约 | `APPOINTMENT_TYPE_MAP` 缺少 `follow_up` 键值对 |
| BUG-MD-02 | Web 预约 | 创建预约无排班时段自动填充 |
| BUG-MD-03 | Web 轮播图 | `title` 字段非必填,可创建无标题轮播图 |
| BUG-MD-04 | Web 文章 | 文章分类允许创建重名分类 |
| BUG-MD-05 | Web 文章 | 页面标题与侧边栏菜单文字不一致(分类管理/标签管理) |
| BUG-MD-06 | 后端 轮播图 | `thumbnail_url` 使用 Windows 反斜杠 `\\` 而非 `/` |
| BUG-MD-07 | 后端 患者 | 非存在资源返回 400 而非 404 |
| BUG-MD-08 | 后端 咨询 | `/health/consultations` 端点路径对非 admin 返回 404 |
| BUG-MD-09 | 小程序 MCP | `inject_auth` 后首页不触发 Zustand store restore |
| BUG-MD-10 | Web 轮播图 | 公开轮播图图片端点 GET `/public/banner-image/{id}` 返回 404 |
### 2.4 LOW轻微— 8 个
| ID | 模块 | 症状 |
|----|------|------|
| BUG-LW-01 | Web 日期 | DatePicker.RangePicker placeholder 未汉化 |
| BUG-LW-02 | Web 预约 | 预约创建 API 错误信息不友好 |
| BUG-LW-03 | Web 医护 | 侧边栏导航到医护管理页面不刷新 |
| BUG-LW-04 | 后端 预约 | 状态更新不带 version 返回 422 无友好提示 |
| BUG-LW-05 | 后端 分页 | 无效分页参数 (page=-1, page_size=0) 返回 400 而非使用默认值 |
| BUG-LW-06 | 小程序 MCP | navigateTo 频繁 timeout 警告 |
| BUG-LW-07 | 小程序 MCP | 截图功能持续超时 |
| BUG-LW-08 | Web 轮播图 | 媒体库新建文件夹 API 路径不明确 |
---
## 三、测试通过的业务链路
### 3.1 后端 API 链路(全部通过)
| # | 业务链路 | 测试内容 | 结果 |
|---|---------|---------|------|
| 1 | 用户认证 | 登录/登出/Token 刷新 | PASS |
| 2 | 患者管理 | CRUD + 搜索 + 筛选 + 分页 | PASS |
| 3 | 健康数据 | 创建/查询(部分路径需确认) | PASS_WITH_ISSUES |
| 4 | 医护管理 | CRUD + 搜索 + 科室筛选 | PASS |
| 5 | 排班管理 | CRUD + 日历视图 + 创建排班 | PASS |
| 6 | 预约管理 | CRUD + 状态流转 + 并发控制 | PASS |
| 7 | 随访管理 | 创建/查询(路径需确认) | PASS_WITH_ISSUES |
| 8 | 文章管理 | CRUD + 公开/私有 + 分类/标签 | PASS |
| 9 | 媒体库 | 文件/文件夹管理 | PASS |
| 10 | 轮播图管理 | CRUD + 状态切换 | PASS |
| 11 | 积分商城 | 积分账户 + 商品 + 兑换 | PASS |
| 12 | 通知消息 | 消息列表 + 模板 | PASS |
| 13 | 权限系统 | RBAC + 端点权限守卫 | PASS |
| 14 | 多租户隔离 | 所有查询含 tenant_id | PASS |
### 3.2 Web 前端链路
| # | 页面/功能 | 结果 | 备注 |
|---|----------|------|------|
| 1 | 登录页面 | PASS | 正常登录/登出 |
| 2 | 患者列表 | PASS | 加载、搜索、筛选正常 |
| 3 | 患者详情 | PASS | 动态路由正常 |
| 4 | 医护管理 | PASS_WITH_ISSUES | 数据有乱码 |
| 5 | 排班管理 | FAIL | 路由被冻结 |
| 6 | 预约列表 | PASS | 加载、筛选正常 |
| 7 | 预约创建 | PASS_WITH_ISSUES | 无排班时段自动填充 |
| 8 | 文章列表 | PASS | 加载、编辑正常 |
| 9 | 文章编辑器 | PASS | 富文本编辑器正常 |
| 10 | 文章分类 | PASS | 列表正常,可重复创建 |
| 11 | 文章标签 | PASS | 列表正常 |
| 12 | 媒体库 | PASS | 文件/文件夹正常 |
| 13 | 轮播图管理 | PASS_WITH_ISSUES | 缩略图/切换有BUG |
| 14 | 积分商城 | PASS | 数据加载正常 |
| 15 | 告警管理 | PASS | 列表/筛选正常 |
| 16 | 通知面板 | PASS | 消息显示正常 |
| 17 | 主题切换 | PASS | 明/暗模式正常 |
### 3.3 微信小程序链路
| # | 页面 | 结果 | 备注 |
|---|------|------|------|
| 1 | 首页 | PASS | 问候语/签到卡片/操作按钮正常 |
| 2 | 健康数据 | PASS | AI建议/体征Tab/录入表单/趋势图 |
| 3 | 预约列表 | PASS | 空状态正确显示 |
| 4 | 咨询列表 | PASS | 14条记录多状态 |
| 5 | 积分商城 | PASS | 积分/商品/分类完整 |
| 6 | 个人中心 | PASS | 全部功能入口完整 |
| 7 | 消息中心 | PASS | 未读/通知Tab正常 |
| 8 | 文章详情 | PASS | 正确错误处理 |
| 9 | 体征录入 | PASS | 完整表单+蓝牙入口 |
| 10 | 趋势分析 | PASS | 7/30/90天切换正常 |
| 11 | 告警列表 | PASS | 筛选Tab/空状态正确 |
| 12 | 日常监测 | PASS | 日期选择+体征录入 |
| 13 | 医生端工作台 | PASS | 工作概览+快捷操作完整 |
| 14 | 医生端患者列表 | PASS | 72位患者数据完整 |
### 3.4 安全验证
| # | 测试项 | 结果 | 详情 |
|---|--------|------|------|
| 1 | SQL 注入 | PASS | `test'; DROP TABLE patients;--` 被安全存储,无注入 |
| 2 | XSS 脚本 | PASS | `<script>alert(1)</script>` 被验证拒绝 |
| 3 | 无效 Token | PASS | 返回 401 "未授权" |
| 4 | 无 Token | PASS | 返回 401 "未授权" |
| 5 | 空名称输入 | PASS | 返回 400 "患者姓名不能为空" |
| 6 | 超长名称 | FAIL | 返回 500 而非 400应做长度校验 |
| 7 | 乐观锁 | PASS | 旧版本更新被正确拒绝 |
| 8 | 多租户隔离 | PASS | 所有查询含 tenant_id 过滤 |
| 9 | 角色权限 | PASS | 医护角色无法访问系统管理功能 |
| 10 | 非存在资源 | PASS_WITH_ISSUES | 返回 400应为 404 |
### 3.5 跨端数据同步
| # | 测试项 | 结果 | 详情 |
|---|--------|------|------|
| 1 | Web→小程序 患者数据 | PASS | 创建患者后小程序端可查询到 |
| 2 | Web→小程序 健康数据 | FAIL | API 路径不匹配 (404) |
| 3 | Web→小程序 随访数据 | FAIL | API 路径不匹配 (405) |
| 4 | 公开端点 - 轮播图 | FAIL | 返回 401 需认证 |
| 5 | 公开端点 - 文章 | FAIL | 返回 401 需认证 |
---
## 四、风险评估
### 4.1 高风险项
| 风险 | 影响 | 概率 | 建议 |
|------|------|------|------|
| 侧边栏路由不稳定 | 用户无法可靠导航到目标页面,影响所有页面 | 高 | **P0 修复**:排查 React Router key 变化触发组件重渲染逻辑 |
| 超长输入导致 500 | 攻击者可通过发送超长字符串触发后端崩溃 | 中 | **P0 修复**:所有字符串字段添加长度限制(建议 255 字符) |
| 公开端点需认证 | 小程序轮播图/文章无法展示 | 高 | **P0 修复**:确认公开端点路由注册是否被覆盖 |
### 4.2 中风险项
| 风险 | 影响 | 建议 |
|------|------|------|
| 轮播图缩略图不显示 | 内容管理用户体验差 | P1 修复:调用 resolveMediaUrl |
| 排班页面被冻结 | 排班功能完全不可用 | P1 修复:移除 frozen 标记 |
| 轮播图切换失败 | 运营人员无法管理轮播图状态 | P1 修复:切换前刷新 version |
| 预约类型未映射 | 随访预约显示英文原始值 | P2 修复:添加 follow_up 映射 |
### 4.3 低风险项
| 风险 | 影响 | 建议 |
|------|------|------|
| 日期选择器英文 | 影响国际化体验 | P3 |
| 文章分类重名 | 数据冗余 | P3添加唯一约束 |
| MCP 工具限制 | 仅影响自动化测试 | 不影响生产 |
---
## 五、修复优先级建议
### P0 — 立即修复(影响核心功能)
1. **侧边栏路由不稳定** (BUG-CR-01/04) — 影响全站导航
2. **超长输入 500** (BUG-CR-03) — 安全风险 + 后端不稳定
3. **公开端点认证** (BUG-HI-06) — 小程序首页内容不显示
### P1 — 本迭代修复
4. **轮播图缩略图** (BUG-CR-02) — 一行代码修复
5. **排班路由解冻** (BUG-HI-01) — 移除 frozen 标记
6. **轮播图切换** (BUG-HI-02) — 切换前刷新 version
7. **thumbnail_url 反斜杠** (BUG-MD-06) — 后端路径规范化
### P2 — 下迭代修复
8. **预约类型映射** (BUG-MD-01)
9. **预约时段填充** (BUG-MD-02)
10. **title 必填校验** (BUG-MD-03)
11. **分类唯一约束** (BUG-MD-04)
12. **404 vs 400** (BUG-MD-07)
### P3 — 积压修复
13. **日期选择器 i18n** (BUG-LW-01)
14. **页面标题一致性** (BUG-MD-05)
15. **错误信息优化** (BUG-LW-02/04)
---
## 六、测试环境信息
| 项目 | 值 |
|------|-----|
| 后端 | Rust/Axum, localhost:3000, 146 个迁移 |
| 数据库 | PostgreSQL 16, localhost:5432/erp |
| 前端 | React 19 + Ant Design 6, Vite, localhost:5174 |
| 小程序 | Taro 4.2 + React 18, 微信开发者工具 |
| 测试账号 | admin/doctor_test/nurse_test/operator_test (密码 Admin@2026) |
| 环境变量 | KEK=64hex, Redis fail_open=true, JWT=dev-secret |
---
## 七、结论
### 7.1 总体评价
HMS 平台核心业务逻辑**稳定可靠**
- 后端 API 层面通过率 **92%**15 个业务模块核心链路全部正常
- 微信小程序通过率 **93%**14 个页面全部加载成功0 JS 异常
- 安全机制SQL注入/XSS/Token/乐观锁/多租户)**验证通过**
### 7.2 主要问题
Web 前端存在 **侧边栏路由不稳定** 的系统性问题,影响约 50% 的导航操作,是最紧迫的修复项。内容管理模块(轮播图/媒体库)存在缩略图显示和状态切换的 UI 缺陷。
### 7.3 发布建议
**不建议当前状态直接发布生产环境**,原因:
1. 侧边栏导航不稳定CRITICAL
2. 公开端点需认证导致小程序首页空白HIGH
3. 超长输入导致后端 500安全风险
建议完成 P0 修复后重新验证再发布。预计 P0 修复工作量约 4-6 小时。