- 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)
212 lines
9.1 KiB
Markdown
212 lines
9.1 KiB
Markdown
---
|
||
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 均 100,LCP 840ms,CLS 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 E2E,118 源文件几乎无覆盖) | 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 审计 + 性能优化 |
|