Files
hms/wiki/testing.md
iven 645ec39e8b
Some checks failed
CI / security-audit (push) Has been cancelled
CI / frontend-build (push) Has been cancelled
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
docs: 更新 wiki 反映 5 角色测试结果和修复教训
- wiki/index.md: 更新关键数字(693 次提交/129 迁移/clippy 0 警告/角色测试完成)
- wiki/index.md: 症状导航添加 5 个已修复问题
- wiki/index.md: 文档索引添加角色测试计划/结果
- wiki/testing.md: 新增 5 角色深度测试结果表格和 7 个 BUG 修复清单
- wiki/testing.md: 历史教训添加 6 条新教训(容错/拦截同步/路径一致/权限语义/clippy/lint-staged)
2026-05-07 23:50:19 +08:00

9.1 KiB
Raw Blame History

title, updated, status, tags
title updated status tags
测试与验证 2026-05-07 stable
testing
verification

测试与验证

index 导航。关联: infrastructure database frontend erp-server erp-health

1. 设计决策

  • 真实数据库优先 — 集成测试用真实 PostgreSQL不用内存模拟
  • 分层验证 — 编译检查 → 单元测试 → 功能验证 → 生产构建
  • 环境配置统一由 infrastructure 管理 — 连接信息、启动命令、登录凭据见该页

2. 关键文件 + 验证清单

测试分布

Crate 单元测试 集成测试 总计 通过率 覆盖评估
erp-core 74 - 74 100% 良好crypto/module/error/rbac/sanitize/types
erp-auth 41 3 44 100% 中等
erp-config 78 - 78 100% 良好
erp-workflow 63 4 67 100% 良好
erp-message 72 - 72 100% 中等(缺集成测试)
erp-health 159 144 303 97% 良好9 个因 blind_indexes 表失败)
erp-ai 36 - 36 100% 中等(缺集成测试)
erp-dialysis 10 15 25 93% 中等2 个失败待修复)
erp-plugin 78 2 80 100% 良好
erp-server - 153 153 94% 良好API 集成测试)
后端总计 611 153 772 97.5%
前端 (vitest) 62 - - - Store(6) + API(20) + 页面(24) + Hook(2) + 组件/工具(10)
E2E (playwright) - 13 spec - - 冒烟(4) + 业务流程(5) + 根目录(4)
小程序 4 4 spec 8 - BLE 模块(4 单元) + 流程测试(4 E2E)

编译 + 测试

cargo check                    # 编译无错误
cargo test --workspace         # 全量测试
cargo clippy -- -D warnings    # Lint 无警告
cargo fmt --check              # 格式检查
cd apps/web && pnpm build      # 前端生产构建
cd apps/web && pnpm test       # 前端单元测试 (vitest)
cd apps/web && pnpm test:e2e   # E2E 测试 (playwright)

功能验证端点

端点 说明
http://localhost:3000/api/v1/health 健康检查
http://localhost:3000/api/docs/openapi.json OpenAPI 文档
http://localhost:5174 前端页面

API 快速测试

# 登录获取 Token
curl -s http://localhost:3000/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"Admin@2026"}'

前端性能基准2026-04-18 Lighthouse

Accessibility / SEO / Best Practices 均 100LCP 840msCLS 0.02

微信小程序验证

cd apps/miniprogram && pnpm build:weapp   # 构建
# 在微信开发者工具中打开 apps/miniprogram 项目
# 点击"编译" → 勾选协议 → 点击"微信一键登录"

验证点:登录成功 → 首页加载 → 各 Tab 页面可访问

3. 代码逻辑

健康模块全链路验证结果2026-04-25

链路 API 前端 UI 状态
医生 CRUD 创建/搜索/编辑 医护管理页面
排班管理 创建/列表/日历 排班管理页面
预约管理 创建+状态流转 预约列表/新建弹窗
随访管理 创建→进行→完成 随访列表/操作
咨询管理 创建会话+消息 咨询列表/导出
患者详情 详情/编辑/标签 详情页+健康数据标签

erp-health validation.rs 测试覆盖

57 个纯函数测试覆盖:

  • 患者信息验证(姓名、身份证、手机号、性别、血型)
  • 预约验证(日期、时段、类型)
  • 随访任务验证(计划日期、类型)
  • 咨询会话验证
  • 体征数据验证(血压范围、心率、体重、血糖)
  • 文章验证

集成契约

方向 模块 触发时机
依赖 ← infrastructure 环境准备、连接信息
验证 → erp-server 健康检查、API 测试
验证 → frontend 生产构建
验证 → erp-health 健康模块全链路验证

不变量: 功能验证需要后端服务运行中,编译检查必须先于测试通过

数据库常用查询

# 连接数据库
D:\postgreSQL\bin\psql.exe -U postgres -h localhost -d erp
SELECT version FROM seaql_migrations ORDER BY version;  -- 迁移记录(当前 104 条)
SELECT code, name FROM permissions WHERE deleted_at IS NULL ORDER BY code;  -- 权限列表
SELECT count(*) FROM patient WHERE deleted_at IS NULL;  -- 患者数量

4. 活跃问题 + 陷阱

5 角色深度测试结果2026-05-07

完整结果见 docs/qa/role-test-results/

角色 测试项 通过 失败 通过率 修复状态
R01 Admin 10 9 1 90% 标签刷新 UI 问题(前端缓存)
R02 Doctor 5 5 0 100%
R03 Nurse 11 10 1 90.9% 已修复(补充 devices.list
R04 Health Manager 10 9 1 90% 已修复(仪表盘容错)
R05 Operator 11 8 3 72.7% 已修复(积分权限码 + 设备权限)

修复的 BUG 清单

BUG 严重度 修复方式
患者空名称可创建 MEDIUM handler 添加 name.trim().is_empty() 校验
仪表盘统计 500 HIGH 容错:单查询失败返回零值 + warn 日志
FHIR 路由 404 HIGH 路由从 /fhir 移到 /api/v1/fhir
冻结模块后端无拦截 MEDIUM 新增 frozen_module_middleware
积分端点权限码错误 LOW health.health-data.listhealth.points.list
护士缺设备列表权限 MEDIUM 迁移补充 health.devices.list
运营缺积分权限 LOW 迁移补充 points.list/manage

测试覆盖空白

领域 当前状态 优先级
erp-ai 集成测试 0 测试SSE 流 + 外部 API 无法回归) P0
小程序测试 仅 8 测试4 BLE 单元 + 4 E2E118 源文件几乎无覆盖) P1
erp-message 集成测试 0 测试SSE 推送连接/重连未测试) P1
Web Hooks 测试 15 个 Hook 仅 2 个有测试13% 覆盖) P2
Web 通用组件测试 11 个组件仅 1 个有测试 P2
erp-dialysis 93% 通过率2 个测试失败待修复) P2
blind_indexes 迁移 9 个测试因表缺失失败(环境配置问题) P3

测试覆盖良好的领域

领域 测试特点
患者 CRUD 完整集成测试覆盖创建/更新/删除/列表
PII 加密 独立测试文件验证加密/解密/盲索引/跨租户隔离
预约并发 CAS 原子操作测试,验证乐观锁和排班满额
工作流引擎 BPMN 解析 + Token 驱动 + 任务分配测试
权限 RBAC 角色/权限/菜单关联测试
插件系统 WASM 运行时 + 动态表 CRUD + 租户隔离

活跃问题

问题 级别 状态
display_name 存储 XSS HTML P1 待修复
antd vendor chunk 2.9MB (gzip ~400KB) P3 待优化

历史教训

  • CRM 权限码与实体名不一致 → 403详见 wasm-plugin 权限命名铁律)
  • AppError::Internal 无日志 → 500 静默(已加 tracing::error
  • build_scope_sql 参数索引硬编码 → SQL 参数错位(已动态化)
  • 已应用迁移文件被删除 → 启动失败(创建 stub 迁移修复)
  • 聚合接口必须容错:仪表盘/统计类接口不应一个子查询失败导致整体 500。unwrap_or_else + tracing::warn 模式
  • 前后端拦截必须同步FROZEN_ROUTES 前端守卫 + 后端中间件缺一不可,否则直接调 API 可绕过
  • 路由注册路径一致性:所有 API 必须在 /api/v1/FHIR 不例外。注册时用 grep 检查路径
  • 权限码要语义匹配:积分端点用积分权限码,不要借用其他模块的权限码(health.health-data.listhealth.points.list
  • 后端验证不可省:前端做了空值检查不等于后端可以跳过。每个 handler 入口必须验证必填字段
  • clippy 0 警告是基线:持续积累 warning 变成雪崩,修复成本远高于即时处理。cargo clippy --workspace -- -D warnings 应无输出

⚠️ 首次 cargo run 需编译整个 workspace含 wasmtime后续增量快 ⚠️ Redis 不可达时限流自动降级为 fail-open

5. 变更记录

日期 变更
2026-05-07 5 角色深度测试 + 7 BUG 修复 + clippy 全 workspace 清零 + lint-staged 修复
2026-05-07 全面刷新:前端 62 测试文件 + 13 E2E spec / 小程序 4 BLE 单元 + 4 E2E / 更新测试覆盖空白清单
2026-05-01 审计数据全面刷新772 测试611 单元 + 153 集成)/ 97.5% 通过率 / 9 个因 blind_indexes 失败 / 前端仅 10 个测试 / 小程序 0 测试
2026-04-25 全面更新93 后端测试 + 3 前端测试、健康模块全链路验证结果、测试覆盖空白清单
2026-04-24 添加微信小程序验证步骤
2026-04-23 重构为 5 节结构,去除与 infrastructure.md 重复
2026-04-18 Lighthouse 审计 + 性能优化