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

212 lines
9.1 KiB
Markdown
Raw Permalink 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.
---
title: 测试与验证
updated: 2026-05-07
status: stable
tags: [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) |
### 编译 + 测试
```bash
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 快速测试
```bash
# 登录获取 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
### 微信小程序验证
```bash
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]] | 健康模块全链路验证 |
**不变量**: 功能验证需要后端服务运行中,编译检查必须先于测试通过
### 数据库常用查询
```bash
# 连接数据库
D:\postgreSQL\bin\psql.exe -U postgres -h localhost -d erp
```
```sql
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.list``health.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.list``health.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 审计 + 性能优化 |