diff --git a/docs/tests/complete-test-framework.md b/docs/tests/complete-test-framework.md new file mode 100644 index 0000000..e812497 --- /dev/null +++ b/docs/tests/complete-test-framework.md @@ -0,0 +1,412 @@ +# AuraK 完整测试框架 + +> 版本: v2.0 · 更新: 2026-06-16 +> 覆盖: 用户管理 / 权限系统 / 考核评估 / 并发场景 / UI验证 + +--- + +## 一、测试架构总览 + +``` +┌────────────────────────────────────────────────────────────────────┐ +│ AuraK 测试框架 │ +├────────────────────────────────────────────────────────────────────┤ +│ │ +│ Phase 0: 系统测试 (System Tests) │ +│ ├── test-systematic.mjs 142项 · 全角色全维度 │ +│ └── test-full-coverage.mjs 52项 · 未覆盖路径补全 │ +│ │ +│ Phase 1: 认证与用户 (Auth & User) │ +│ ├── 登录/登出/Token校验/API Key │ +│ ├── 用户 CRUD 正常/异常/边界 │ +│ └── 角色升降级即时生效 │ +│ │ +│ Phase 2: 权限 RBAC (Permission) │ +│ ├── 三层角色权限验证 (26/21/5) │ +│ ├── 系统角色保护 / 自定义角色 CRUD │ +│ └── 前端组件级门控 (PermissionGate) │ +│ │ +│ Phase 3: 考核评估 (Assessment) │ +│ ├── test-assessment-smoke.mjs 29项 · 烟雾测试 │ +│ ├── test-e2e-assessment-full-flow.mjs 29项 · 端到端全流程 │ +│ ├── test-p2-advanced.mjs 20项 · P2 高级功能 │ +│ ├── test-concurrent-assessments.mjs · 20人并发考核 │ +│ └── test-multiround.mjs · 多轮对话 │ +│ │ +│ Phase 4: 出题引擎 (Question Engine) │ +│ ├── 维度权重分配算法验证 (floor+remainder) │ +│ ├── 题库容量与重叠率检查 │ +│ └── judgment/评分标准完整性校验 │ +│ │ +│ Phase 5: 场景验证 (Scenario) │ +│ ├── exam-organizer.mjs · 考试组织者全流程 │ +│ └── test-permission-flow.mjs · 三层角色权限验证 │ +│ │ +│ Phase 6: 缺陷回归 (Regression) │ +│ ├── shuffleArray bug 回归 │ +│ ├── 系统角色权限不可改 (isSystem 保护) │ +│ └── 获取 /users/:id 端点缺失修复 │ +│ │ +└────────────────────────────────────────────────────────────────────┘ +``` + +## 二、各 Phase 详细说明 + +### Phase 0 — 系统测试 (System Tests) + +**执行周期**: 每次代码变更后必跑 + +| 脚本 | 项数 | 通过率 | 说明 | +|------|:----:|:------:|------| +| `test-systematic.mjs` | 142 | ✅ 142/142 | 全角色(SA/TA/USER) × 全维度(身份/CRUD/RBAC/UI/用户故事) | +| `test-full-coverage.mjs` | 52 | ✅ 52/52 | 未覆盖路径: 角色权限边界 × 模板极值 × 异常链 × 跨功能交互 | + +**测试范围**: + +``` +1. 环境准备 4项 +2. 身份认证 15项 (登录/错误密码/空凭据/篡改JWT/API Key) +3. 用户CRUD正常 11项 (创建/查询/编辑/升降级/删除/登录失效) +4. 用户CRUD异常 17项 (重复/空/短密码/emoji/不存在/越权) +5. 边界测试 7项 (并发同名/超长/空权限/幂等删除) +6. 权限矩阵RBAC 49项 (三层权限数/S应有/TA应有/USER无/API校验证/系统保护) +7. 租户隔离 1项 +8. 缺陷回归 5项 +9. 前端UI一致性 22项 (登录页/导航/设置Tab/弹窗/权限矩阵/三角色限制) +10. 用户故事完整 14项 (SA/TA/USER闭环/升降级即时/系统不可破坏) +``` + +--- + +### Phase 1 — 认证与用户系统 + +#### 1.1 身份认证 (Authentication) + +| # | 测试点 | 输入 | 预期 | +|---|--------|------|------| +| A-01 | 正常密码登录 | admin / admin123 | 200 + access_token | +| A-02 | 错误密码 | admin / wrong | 401 | +| A-03 | 空密码 | admin / "" | 401 | +| A-04 | 不存在用户 | nobody / x | 401 | +| A-05 | 空JSON body | {} | 401 | +| A-06 | 空body | (empty) | 400/401 | +| A-07 | 无Authorization头 | — | 401 | +| A-08 | 无效Bearer | "Bearer invalid" | 401 | +| A-09 | 篡改JWT | 伪造token | 401 | +| A-10 | API Key获取 | Bearer token | 200 + apiKey | +| A-11 | JWT payload校验 | — | 含 id, role, tenantId | +| A-12 | USER登录 | user1/pass123 | 200 | +| A-13 | TA登录 | ta_admin/pass123 | 200 | + +#### 1.2 用户 CRUD (User Create/Read/Update/Delete) + +**正常路径**: + +| # | 操作 | 预期 | +|---|------|------| +| U-01 | SA创建用户(含displayName) | 201 + user.id | +| U-02 | TA创建用户(本租户) | 201 | +| U-03 | 用户加入租户 | 201 | +| U-04 | 按ID查询用户 | 200 + 用户数据 | +| U-05 | 用户列表含新用户 | 列表中可找到 | +| U-06 | 编辑用户displayName | 200 | +| U-07 | 提升 USER→TENANT_ADMIN | 200 + 权限从5→21 | +| U-08 | 降级 TENANT_ADMIN→USER | 200 + 权限从21→5 | +| U-09 | 删除用户 | 200 | +| U-10 | 删除后不可查询 | 404 | +| U-11 | 删除后无法登录 | 401 | + +**异常路径**: + +| # | 操作 | 预期 | +|---|------|------| +| U-12 | 重复用户名 | 409 | +| U-13 | 空用户名 | 400 | +| U-14 | 密码太短(5位) | 400 | +| U-15 | 缺password | 400 | +| U-16 | 密码6位(边界) | 201 | +| U-17 | 编辑不存在用户 | 404 | +| U-18 | 编辑 admin 账号 | 400 | +| U-19 | 删自己 | 400 | +| U-20 | 删不存在用户 | 404 | +| U-21 | 删 admin 账号 | 400 | +| U-22 | USER 删用户 | 403 | +| U-23 | TA 删用户 | 403 | +| U-24 | 非法角色值 | 400 | +| U-25 | 改不存成员 | 400 | + +--- + +### Phase 2 — 权限系统 (RBAC) + +#### 2.1 三层角色权限矩阵 + +| 权限 | SUPER_ADMIN | TENANT_ADMIN | USER | +|------|:-----------:|:------------:|:----:| +| user:view | ✅ | ✅ | ❌ | +| user:create | ✅ | ✅ | ❌ | +| user:edit | ✅ | ✅ | ❌ | +| user:delete | ✅ | ❌ | ❌ | +| user:role | ✅ | ❌ | ❌ | +| tenant:view | ✅ | ✅ | ❌ | +| tenant:create | ✅ | ❌ | ❌ | +| tenant:delete | ✅ | ❌ | ❌ | +| tenant:members | ✅ | ✅ | ❌ | +| kb:view | ✅ | ✅ | ✅ | +| kb:create | ✅ | ✅ | ✅ | +| kb:edit | ✅ | ✅ | ✅ | +| kb:delete | ✅ | ✅ | ❌ | +| assess:view | ✅ | ✅ | ✅ | +| assess:manage | ✅ | ✅ | ❌ | +| assess:template | ✅ | ✅ | ❌ | +| assess:bank | ✅ | ✅ | ❌ | +| model:view | ✅ | ✅ | ❌ | +| model:config | ✅ | ✅ | ❌ | +| plugin:view | ✅ | ✅ | ✅ | +| plugin:manage | ✅ | ✅ | ❌ | +| settings:view | ✅ | ✅ | ❌ | +| settings:system | ✅ | ❌ | ❌ | +| **权限总数** | **26** | **21** | **5** | + +#### 2.2 角色 CRUD + +| # | 操作 | 预期 | +|---|------|------| +| R-01 | SA列出角色 | 200 + 3系统角色 | +| R-02 | TA列出角色 | 200 | +| R-03 | USER列出角色 | 403 | +| R-04 | 创建自定义角色 | 201 | +| R-05 | 重复角色名 | 400 | +| R-06 | 编辑自定义角色名 | 200 | +| R-07 | 编辑系统角色名 | 400 | +| R-08 | 删除自定义角色 | 200 | +| R-09 | 删除系统角色 | 400 | +| R-10 | 删除已删角色 | 404 | +| R-11 | 角色设权限 | 200 | +| R-12 | 角色读权限 | 200 | +| R-13 | 空权限数组 | 200 | +| R-14 | 无效权限key | 400 | +| R-15 | 系统角色权限不可改 | 400 (isSystem保护) | + +#### 2.3 前端权限门控 + +| # | 角色 | 可见Tab | +|---|------|---------| +| F-01 | SUPER_ADMIN | 用户管理 ✅ / 权限管理 ✅ / 租户管理 ✅ | +| F-02 | TENANT_ADMIN | 用户管理 ❌(仅SA可见) / 权限管理 ✅ / 租户管理 ❌ | +| F-03 | USER | 用户管理 ❌ / 权限管理 ❌ / 租户管理 ❌ | + +--- + +### Phase 3 — 考核评估系统 (Assessment) + +#### 3.1 烟雾测试 (Smoke Test) — `test-assessment-smoke.mjs` + +| # | 检查项 | 说明 | +|---|--------|------| +| S-01 | admin 登录 | 管理员身份验证 | +| S-02 | ta_admin 登录 | 租管身份验证 | +| S-03 | user1 登录 | 用户身份验证 | +| S-04 | 模板列表可获取 | API 可用 | +| S-05 | 至少一个模板 | 系统有默认模板 | +| S-06 | 技术人员模板存在 | 核心模板存在 | +| S-07 | 非技术人员模板存在 | 备选模板存在 | +| S-08 | attemptLimit 未锁定 | 非1(admin不被锁) | +| S-09 | 题库可获取 | 题库 API 正常 | +| S-10 | 题库有题目 | 题库非空 | +| S-11 | 启动考核正常 | start API 正常 | +| S-12 | 出题成功 | 异步出题完成 | +| S-13 | 包含 PROMPT 维度 | 维度覆盖正确 | +| S-14 | 包含 LLM 维度 | 维度覆盖正确 | +| S-15 | 答题提交正常 | 4题全部成功 | +| S-16 | 评分状态正常 | 评分不报错 | +| S-17 | 证书可获取 | 证书 API 正常 | +| S-18 | 证书含等级 | 等级判定正常 | +| S-19 | 证书含总分 | 分数计算正常 | +| S-20 | USER 创建模板被拒 | 权限隔离生效 | +| S-21 | TA 可查看模板 | TA 权限正确 | +| S-22 | USER 可查看题库 | 读权限开放 | +| S-23 | USER 不能查看他人回顾 | 数据隔离生效 | +| S-24 | 考核页渲染 | 前端页面加载 | +| S-25 | 模板按钮可见 | UI 元素渲染 | +| S-26 | 开始评估按钮可见 | UI 交互可用 | +| S-27 | 点击开始无报错 | 前端无崩溃 | +| S-28 | 题目已加载 | 题目显示到页面 | + +#### 3.2 端到端全流程 (E2E Full Flow) — `test-e2e-assessment-full-flow.mjs` + +| 阶段 | 测试项 | 详细验证 | +|------|--------|---------| +| **模板校验** | 维度配置 | 技术人员模板有 PROMPT/LLM/IDE/DEV_PATTERN | +| | attemptLimit | 非1锁定状态 | +| | 题数合理 | ≥4题 | +| **题库校验** | 技术人员题库 | 有MC和SA题 | +| | PROMPT/LLM/IDE/DEV_PATTERN | 每维度≥10/10/4/4题 | +| | 评分标准 | 全部简答题有judgment | +| | 非技术人员题库 | 有题且无IDE/DEV_PATTERN | +| **API考核** | 创建考生 | POST /users | +| | 启动考核 | POST /assessment/start | +| | 异步出题 | 等待 /state 返回 questions | +| | 维度分布 | 含PROMPT和LLM | +| | 答题 | 4题全部成功 | +| | 证书 | 可获取+含等级+含分数+含维度得分 | +| | 历史记录 | 考核列表有记录 | +| **非技术模板** | 启动 | 正常 | +| | 出题 | 无IDE/DEV_PATTERN | +| | 维度 | 仅PROMPT/LLM | +| **前端 UI** | 登录 | 页面登录成功 | +| | 模板选择 | 按钮可见可点 | +| | 答题(MC+SA) | 最多4题含追问 | +| | 结果 | 显示等级/分数 | +| | 截图 | e2e-assessment-result.png | + +#### 3.3 P2 高级功能 (Advanced Features) — `test-p2-advanced.mjs` + +| # | 功能 | 测试 | 结果 | +|---|------|------|:----:| +| P-01 | attemptLimit 写入 | 设2→读取=2 | ✅ | +| P-02 | reviewMode 写入 | 设after_completion→读取 | ✅ | +| P-03 | shuffleQuestions 写入 | 设true→读取 | ✅ | +| P-04 | 尝试次数限制 | 超限后拒绝 | ✅ | +| P-05 | 预约开始 | 未到时间拒绝 | ✅ | +| P-06 | 预约结束 | 已过时间拒绝 | ✅ | +| P-07 | 答题回顾API | 返回含正确答案 | ✅ | +| P-08 | 回顾含解析 | judgment字段可见 | ✅ | +| P-09 | shuffleQuestions生效 | flag=true时启用 | ✅ | +| P-10 | 模板配置恢复 | 恢复后正常 | ✅ | +| **总计** | **20项** | **全部通过** | **✅** | + +#### 3.4 多轮对话 (Multi-round) — `test-multiround.mjs` + +| # | 场景 | 说明 | +|---|------|------| +| M-01 | 选择题答题 | 检测选项按钮→点击→确认答案 | +| M-02 | 简答题答题 | textarea输入→发送按钮 | +| M-03 | AI追问 | 简答后textarea重现→输入追问回答 | +| M-04 | 4题全流程 | 完整完成4题混合题型 | + +#### 3.5 出题算法验证 + +``` +验证: floor + remainder 分配法 → 总和恒等于题数 + +技术人员模板(30/30/20/20): + 20题 → PROMPT:6 + LLM:6 + IDE:4 + DEV_PATTERN:4 = 20 ✅ + 10题 → PROMPT:3 + LLM:3 + IDE:2 + DEV_PATTERN:2 = 10 ✅ + 5题 → PROMPT:2 + LLM:1 + IDE:1 + DEV_PATTERN:1 = 5 ✅ + 4题 → PROMPT:2 + LLM:2 + IDE:0 + DEV_PATTERN:0 = 4 ✅ (旧算法: 4题 = 1+1+1+1=4❌) + +非技术人员模板(50/30/20): + 10题 → PROMPT:5 + LLM:3 + WORK_CAP:2 = 10 ✅ +``` + +--- + +### Phase 4 — 场景测试 (Scenario) + +#### 4.1 考试组织者场景 — `exam-organizer.mjs` + +``` +流程: 管理员登录 → 创建4个考生(初/中/高级+初级) + → 4考生依次参加考核(UI操作,含MC+SA+追问) + → 查看考核结果统计 +``` + +#### 4.2 并发考核场景 — `test-concurrent-assessments.mjs` + +| # | 场景 | 结果 | +|---|------|:----:| +| C-01 | 20人并发创建账号 | ✅ 全部成功 | +| C-02 | 20人并发启动考核 | ✅ 全部成功, Session ID 唯一 | +| C-03 | 异步出题完成率 | ✅ 20/20, 每题20题 | +| C-04 | 各会话题数一致 | ✅ 均为20题 | +| C-05 | 维度分布正确 | ✅ IDE:4/LLM:6/PROMPT:6/DEV_PATTERN:4 | +| C-06 | 并发提交答案 | ✅ 6人×4题全部成功 | +| C-07 | 题目重叠率 | ⚠️ 10.5%(题库281题不够400槽位) | + +--- + +### Phase 5 — 缺陷回归 (Regression) + +| # | 缺陷 | 发现者 | 修复状态 | +|---|------|--------|:--------:| +| REG-01 | shuffleArray 返回新数组但调用处用const未接收 | 代码审查 | ✅ 已修 | +| REG-02 | 系统角色权限可被修改(setRolePermissions缺isSystem检查) | 全量回归测试 | ✅ 已修 | +| REG-03 | GET /users/:id 端点不存在 | 系统性测试 | ✅ 已修 | +| REG-04 | DTO中perQuestionTimeLimit边界值校验缺失 | 边界测试 | ✅ 已修 | +| REG-05 | P2字段(attemptLimit等)在startSession中未正确映射 | P2测试 | ✅ 已修 | + +--- + +## 三、测试脚本索引 + +### 3.1 脚本一览 + +| 脚本 | 行数 | 测试类型 | 运行时间 | 依赖 | 说明 | +|------|:----:|:--------:|:--------:|:----|------| +| `test-systematic.mjs` | 480+ | API+UI | ~60s | 前后端 | **必跑** 全角色全维度 | +| `test-full-coverage.mjs` | 350+ | API | ~5s | 后端 | 未覆盖路径补全 | +| `test-e2e-assessment-full-flow.mjs` | 300+ | API+UI | ~90s | 前后端 | **新** 考核端到端全流程 | +| `test-assessment-smoke.mjs` | 280+ | API+UI | ~75s | 前后端 | **新** 快速烟雾测试 | +| `test-p2-advanced.mjs` | 200+ | API | ~30s | 后端 | P2高级功能专项 | +| `test-concurrent-assessments.mjs` | 230+ | API | ~100s | 后端 | 20人并发考核 | +| `test-user-lifecycle.mjs` | 400+ | API+UI | ~30s | 前后端 | 用户全生命周期+异常 | +| `test-permission-flow.mjs` | 200+ | API+UI | ~40s | 前后端 | 三层角色权限验证 | +| `test-multiround.mjs` | 230+ | UI | ~60s | 前后端 | 考核多轮对话 | +| `test-question-distribution.mjs` | 70+ | UI | ~30s | 前后端 | 出题分布验证 | +| `exam-organizer.mjs` | 300+ | API+UI | ~180s | 前后端 | 考试组织场景 | + +### 3.2 推荐执行策略 + +``` +快速检查 (~2min): + node test-assessment-smoke.mjs # 29项烟雾测试 + node test-full-coverage.mjs # 52项全量回归 + +完整检查 (~6min): + node test-systematic.mjs # 142项系统测试 + node test-e2e-assessment-full-flow.mjs # 29项端到端 + node test-p2-advanced.mjs # 20项P2专项 + +深度检查 (~10min): + 完整检查 + + node test-concurrent-assessments.mjs # 20人并发 + node exam-organizer.mjs # 考试组织场景 + node test-multiround.mjs # 多轮对话 +``` + +--- + +## 四、测试结果汇总 + +| 测试套件 | 通过 | 失败 | 通过率 | 最新运行 | +|---------|:---:|:----:|:------:|:--------:| +| 系统性测试 (142项) | 142 | 0 | 100% | 2026-06-09 | +| 全量回归 (52项) | 52 | 0 | 100% | 2026-06-09 | +| 烟雾测试 (29项) | 29 | 0 | 100% | 2026-06-16 | +| 端到端全流程 (29项) | 29 | 0 | 100% | 2026-06-16 | +| P2专项 (20项) | 20 | 0 | 100% | 2026-06-09 | +| 并发测试 (20人) | — | — | ✅ | 2026-06-08 | +| 用户生命周期 (42项) | 42 | 0 | 100% | 2026-06-09 | +| **总计** | **~314** | **0** | **100%** | | + +--- + +## 五、测试发现并修复的缺陷清单 + +| # | 缺陷 | 模块 | 严重度 | 修复PR | +|---|------|------|:------:|--------| +| 1 | shuffleArray 返回值未接收 | question-bank.service | 🔴 | c57c302 | +| 2 | 系统角色权限可被随意修改 | permission.service | 🔴 | a7e7c85 | +| 3 | GET /users/:id 缺失 | user.controller | 🟡 | 7e74165 | +| 4 | P2模板字段未映射到 session | assessment.service | 🟡 | d15e881 | +| 5 | 出题分配Math.round合计偏差 | question-bank.service | 🟡 | 1aee7e0 | +| 6 | questionCount=0/50未做DAO校验 | dto/create-template.dto | 🟡 | 9fd503b | +| 7 | text-[10px] 字号系统不统一 | UI (多个组件) | 🟢 | ffe3652 | +| 8 | 登录页blue与后台indigo不一致 | LoginPage.tsx | 🟢 | ffe3652 | +| 9 | 操作列 opacity-0 完全隐藏 | SettingsView.tsx | 🟢 | c166d29 | +| 10 | 编辑弹窗 max-w-md 过窄 | SettingsView.tsx | 🟢 | c166d29 | +| 11 | 会议记录题 PROMPT→LLM 维度错位 | question_bank_items | 🟡 | 75769b1 | +| 12 | 151道简答题缺评分标准 | question_bank_items | 🟡 | 75769b1 | +| 13 | 非技术人员模板无题库 blank | 题库关联 | 🟡 | 75769b1 | +| 14 | templateData P2字段显式映射确认 | assessment.service | 🟡 | d15e881 |