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)
This commit is contained in:
@@ -4,27 +4,32 @@
|
||||
|
||||
## 关键数字
|
||||
|
||||
> 最后更新: 2026-05-07 | 数据截止: commit 6d5a711 (第 693 次提交)
|
||||
|
||||
| 指标 | 值 |
|
||||
|------|-----|
|
||||
| Rust crate | 18 个(erp-core + 5 基础业务 + erp-health + erp-ai + erp-dialysis + erp-plugin + 5 插件 + erp-plugin-prototype) |
|
||||
| 数据库表 | 30 基础表 + 44 健康业务表 + 3 AI 表(已实现) |
|
||||
| 数据库迁移 | 123 个 |
|
||||
| 后端路由 | 328 个(8 公开 + 320 受保护) |
|
||||
| 数据库迁移 | 129 个 |
|
||||
| 后端路由 | 250+ 个(8 公开 + 14 FHIR + 2 网关 + ~230 受保护) |
|
||||
| 核心模块 | 5 基础 (auth/config/workflow/message/plugin) + 3 业务 (health + ai + dialysis) |
|
||||
| erp-health 实体 | 46 个 Entity(~27k 行 Rust) |
|
||||
| erp-ai 实体 | 6 个 Entity(~3.6k 行 Rust) |
|
||||
| Web 前端 | 225 个 TS/TSX 文件(含 25+ 健康路由页面 + 工作台组件) |
|
||||
| 微信小程序 | Taro 4.2 + React 18,182 个源文件 / 40+ 页面 / 5 TabBar + 医生端 |
|
||||
| 前端单元测试 | 36 个测试文件(vitest)+ 5 E2E spec(playwright) |
|
||||
| erp-health 实体 | 46 个 Entity(~36k 行 Rust,179 文件) |
|
||||
| erp-ai 实体 | 6 个 Entity(~7k 行 Rust,45 文件,4 AI Provider) |
|
||||
| Web 前端 | 283 个 TS/TSX 文件(55 路由,含 38 健康路由 + 6 冻结路由) |
|
||||
| 微信小程序 | Taro 4.2 + React 18,118 个 TS/TSX 文件 / ~54 页面 / 4 TabBar + 医生端分包 |
|
||||
| 前端单元测试 | 62 个测试文件(vitest)+ 13 E2E spec(playwright) |
|
||||
| 后端测试 | 611 单元 + 153 集成 = 772 个函数(97.5% 通过率) |
|
||||
| 总代码量 | Rust ~87k 行(484 源文件)+ Web 前端 225 文件 + 小程序 182 文件 |
|
||||
| 事件系统 | 25 事件类型 / 44 发布处 / 14 消费者 |
|
||||
| DTO | 105+ 个结构体(23 文件) |
|
||||
| 总代码量 | Rust ~87k 行(579 源文件)+ Web 前端 283 文件 + 小程序 118 文件 |
|
||||
| 事件系统 | 31+ 事件类型(health 模块内)/ 23 幂等消费者 / Outbox + LISTEN/NOTIFY |
|
||||
| DTO | 105+ 个结构体(20+ 文件) |
|
||||
| 权限码 | 50 声明(health 39 + ai 6 + dialysis 5)+ 56 基础模块手动注册 |
|
||||
| Clippy | **全 workspace 0 警告**(2026-05-07 清零) |
|
||||
| API 文档 | `http://localhost:3000/api/docs/openapi.json` |
|
||||
| Git 提交 | 577 次 |
|
||||
| 审计状态 | 2026-04-30 全系统审计完成(83% 总体完成度) |
|
||||
| Git 提交 | 693 次 |
|
||||
| 审计状态 | V1: 83% (2026-04-30) → V2: 85% (2026-05-05),P0 安全修复已完成 |
|
||||
| 角色测试 | R01-R05 全角色验证完成,86.5% 通过率,5 个 BUG 已修复 |
|
||||
| UI/UX 重构 | Phase 1-5 完成(6 共享组件 + 4 角色仪表盘 + 个人统计数据 + 表单抽屉 + 小程序优化) |
|
||||
| 项目阶段 | **上线前质量加固**(近 30 次提交全为 fix 类型) |
|
||||
|
||||
## 症状导航
|
||||
|
||||
@@ -60,6 +65,11 @@
|
||||
| Ollama 暴露到局域网 | [[infrastructure]] Ollama 安全 | `OLLAMA_HOST` | 默认 `0.0.0.0`,必须设 `127.0.0.1` |
|
||||
| AI 趋势/报告分析 500 模板渲染失败 | [[erp-ai]] Handlebars 模板 | `anomalies.length` | `.length` 不是有效 Handlebars 语法,改为 `{{#if anomalies}}` |
|
||||
| AI 分析 400 缺少数据 | 后端预校验 | handler 层 | 化验报告 items 为空 / 趋势数据 metrics 为空 |
|
||||
| 患者创建空名称成功 | [[erp-health]] patient_handler | `name.trim().is_empty()` | **已修复:** 后端添加空名称校验返回 Validation 错误 |
|
||||
| 仪表盘统计 500 | [[erp-health]] stats_handler | 单个查询异常导致整接口崩溃 | **已修复:** 容错处理,单个查询失败返回零值 |
|
||||
| FHIR 端点全部 404 | [[erp-server]] main.rs | 路由注册在 `/fhir` 非 `/api/v1/fhir` | **已修复:** 移到 `/api/v1/fhir` |
|
||||
| 冻结模块 API 可绕过 | [[erp-server]] frozen_module | 后端无拦截中间件 | **已修复:** 新增 `frozen_module_middleware` |
|
||||
| 积分端点 403 权限码错 | [[erp-health]] points_handler | 患者端用了 `health.health-data.list` | **已修复:** 改为 `health.points.list` |
|
||||
|
||||
## 模块导航
|
||||
|
||||
@@ -86,8 +96,8 @@
|
||||
|
||||
### 基础设施
|
||||
- [[infrastructure]] — 连接信息 · 环境变量 · 一键启动 (**单一真相源**)
|
||||
- [[database]] — SeaORM 迁移 · 多租户表结构(103 迁移)
|
||||
- [[frontend]] — React 19 SPA · 健康管理页面(25+ 路由 + 工作台组件)
|
||||
- [[database]] — SeaORM 迁移 · 多租户表结构(128 迁移)
|
||||
- [[frontend]] — React 19 SPA · 健康管理页面(55 路由 + 工作台组件)
|
||||
- [[testing]] — 验证清单 · 测试分布 · 性能基准
|
||||
|
||||
## 核心架构问答
|
||||
@@ -110,11 +120,12 @@
|
||||
| PII 加密扩展规格 | `docs/superpowers/specs/2026-04-26-pii-encryption-expansion-design.md` |
|
||||
| 实时体征管线探讨 | `docs/superpowers/specs/2026-04-26-realtime-vital-signs-pipeline-design.md` |
|
||||
| 平台复盘与演进 | `docs/superpowers/specs/2026-04-26-platform-retrospective-and-evolution-design.md` |
|
||||
| 设计规格(全量) | `docs/superpowers/specs/` (41 份) |
|
||||
| 设计规格(全量) | `docs/superpowers/specs/` (47 份) |
|
||||
| UI/UX 重构设计规格 | `docs/superpowers/specs/2026-04-28-ui-ux-overhaul-design.md` |
|
||||
| UI/UX 重构实施计划 | `docs/superpowers/plans/2026-04-28-ui-ux-overhaul-plan.md` |
|
||||
| 实施计划(全量) | `docs/superpowers/plans/` (38 份) |
|
||||
| 全系统审计报告 | `docs/audits/08-audit-report-2026-04-30.md`(83% 总体完成度,2 CRITICAL + 3 HIGH) |
|
||||
| 实施计划(全量) | `docs/superpowers/plans/` (49 份) |
|
||||
| 全系统审计报告(V1) | `docs/audits/08-audit-report-2026-04-30.md`(83% 总体完成度,2 CRITICAL + 3 HIGH) |
|
||||
| 全系统审计报告(V2) | `docs/audits/v2/13-final-report.md`(85% 总体完成度,P0 安全修复已完成) |
|
||||
| 审计基线快照 | `docs/audits/00-baseline-snapshot.md` |
|
||||
| 审计功能清单 | `docs/audits/01-feature-inventory.md`(328 路由三端映射矩阵) |
|
||||
| 审计后端完整性 | `docs/audits/02-backend-integrity.md`(100% 调用链连通) |
|
||||
@@ -123,9 +134,15 @@
|
||||
| 审计差距模式 | `docs/audits/05-gap-patterns.md`(5 种模式,透析/知情同意 MP 缺失) |
|
||||
| 审计错误处理 | `docs/audits/06-error-handling.md`(SSE 不挂起 / 日志 30% 覆盖) |
|
||||
| 审计测试覆盖 | `docs/audits/07-test-coverage.md`(772 测试 / 前端极低 / AI 无集成测试) |
|
||||
| 讨论记录 | `docs/discussions/` (18 份) |
|
||||
| 讨论记录 | `docs/discussions/` (26 份) |
|
||||
| 事件注册表 | `docs/event-registry.md` |
|
||||
| Wiki 方法论 | `docs/wiki-methodology.md` |
|
||||
| 项目深度分析 | `docs/superpowers/specs/2026-05-03-project-analysis-brainstorm-design.md`(5 专家组分析,B+ 评分) |
|
||||
| 三维度系统分析 | `docs/discussions/2026-05-07-three-dimension-analysis.md`(后端/前端/质量三维深度分析,2026-05-07) |
|
||||
| 多专家组头脑风暴 | `docs/discussions/2026-05-07-expert-brainstorm-session.md`(5 专家组评审,综合 6.4/10 B-,行动清单) |
|
||||
| 角色测试计划(全量) | `docs/qa/role-test-plans/` (R01-R05) |
|
||||
| 角色测试结果 | `docs/qa/role-test-results/` (R01 100% / R02 100% / R03 90.9% / R04 90.0% / R05 72.7% → 修复后待复测) |
|
||||
| 系统集成测试结果 | `docs/qa/role-test-results/T00-system-integration-results.md` (20/28 通过) |
|
||||
| 小程序 E2E 测试结果 | `docs/qa/role-test-results/T10-miniprogram-e2e-results.md` (需手动执行) |
|
||||
| 协作规则 | `CLAUDE.md` |
|
||||
| 插件制作指南 | `.claude/skills/plugin-development/SKILL.md` |
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: 测试与验证
|
||||
updated: 2026-04-28
|
||||
updated: 2026-05-07
|
||||
status: stable
|
||||
tags: [testing, verification]
|
||||
---
|
||||
@@ -32,9 +32,9 @@ tags: [testing, verification]
|
||||
| erp-plugin | 78 | 2 | 80 | 100% | 良好 |
|
||||
| erp-server | - | 153 | 153 | 94% | 良好(API 集成测试) |
|
||||
| **后端总计** | **611** | **153** | **772** | **97.5%** | |
|
||||
| 前端 (vitest) | 36 | - | - | - | Store/Hook/API 契约/组件测试 |
|
||||
| E2E (playwright) | - | 5 spec | - | - | 登录/用户管理/插件/租户隔离 |
|
||||
| 小程序 | 0 | 0 | 0 | N/A | ⚠️ 完全无测试 |
|
||||
| 前端 (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) |
|
||||
|
||||
### 编译 + 测试
|
||||
|
||||
@@ -128,14 +128,39 @@ 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 |
|
||||
| 小程序测试 | **0 测试**(40 个页面全靠手工验证) | P1 |
|
||||
| 小程序测试 | **仅 8 测试**(4 BLE 单元 + 4 E2E,118 源文件几乎无覆盖) | P1 |
|
||||
| erp-message 集成测试 | **0 测试**(SSE 推送连接/重连未测试) | P1 |
|
||||
| Web 前端测试 | 仅 10 个(163 文件的 API/组件/路由无覆盖) | P2 |
|
||||
| Web Hooks 测试 | 15 个 Hook 仅 2 个有测试(13% 覆盖) | P2 |
|
||||
| Web 通用组件测试 | 11 个组件仅 1 个有测试 | P2 |
|
||||
| erp-dialysis | 93% 通过率(2 个测试失败待修复) | P2 |
|
||||
| blind_indexes 迁移 | 9 个测试因表缺失失败(环境配置问题) | P3 |
|
||||
|
||||
@@ -163,6 +188,12 @@ SELECT count(*) FROM patient WHERE deleted_at IS NULL; -- 患者数量
|
||||
- `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
|
||||
@@ -171,6 +202,8 @@ SELECT count(*) FROM patient WHERE deleted_at IS NULL; -- 患者数量
|
||||
|
||||
| 日期 | 变更 |
|
||||
|------|------|
|
||||
| 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 | 添加微信小程序验证步骤 |
|
||||
|
||||
Reference in New Issue
Block a user