Files
aurak/docs/tests/complete-test-framework.md
T
Developer 07308cae99 docs: 完整测试框架文档 — 5个Phase + 272项测试索引 + 14个缺陷记录
涵盖:
- Phase 0-5 测试架构与详细用例清单
- 脚本索引(11个测试脚本)与执行策略
- 全部测试结果汇总(~314项 100%通过)
- 14个已修复缺陷跟踪表

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 10:55:42 +08:00

413 lines
18 KiB
Markdown
Raw 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.
# 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 |