test: 端到端全流程测试 + 烟雾测试 + 测试方案文档

新增:
1. test-e2e-assessment-full-flow.mjs — 完整端到端流程
   登录→模板校验→题库校验→API考核→非技术模板→UI端到端
   覆盖7个阶段29项检查,全部通过

2. test-assessment-smoke.mjs — 快速烟雾测试(29项)

3. docs/tests/assessment-test-plan.md — 完整测试方案文档
   5个Phase: 核心流程/评分证书/权限隔离/压力异常/回归测试

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Developer
2026-06-16 10:51:09 +08:00
parent ce1a17b4f2
commit 3d41f0dfcb
3 changed files with 757 additions and 0 deletions
+137
View File
@@ -0,0 +1,137 @@
# 人才测评系统 — 自动化测试方案
## 测试策略
```
分层测试 + 渐进覆盖:先测核心流程 → 再测边界异常 → 最后全回归
```
---
## Phase 1: 核心考核流程(优先级 P0)
### 1.1 正常考核全流程
| # | 测试场景 | 步骤 | 预期结果 |
|---|---------|------|---------|
| 1.1.1 | 技术人员模板完整答题 | 登录 → 考核页 → 选模板 → 开始 → 答4题(MC+SA) → 提交 → 查看结果 | 全部题目可答,最终显示等级和分数 |
| 1.1.2 | 非技术人员模板完整答题 | 同上,选非技术模板 | 可正常完成 |
| 1.1.3 | 选择题答题 | 检测到选择题选项 → 选一个 → 确认答案 | 选项正确显示,确认成功 |
| 1.1.4 | 简答题答题 | 检测到 textarea → 输入文字 → 发送 | 文字发送成功 |
| 1.1.5 | AI 追问流程 | 简答提交后检测 textarea 是否重现 → 输入追问回答 | 追问正常触发,回答后继续 |
| 1.1.6 | 结果页验证 | 完成考核后检测页面 | 显示分数、等级、合格/不合格 |
### 1.2 考核模板配置
| # | 测试场景 | 步骤 | 预期结果 |
|---|---------|------|---------|
| 1.2.1 | 两个模板均可见 | 登录后进入考核页 | 技术人员模板 + 非技术人员模板都显示 |
| 1.2.2 | 题数指示器正确 | 出题后检查页面的题数指示 | 显示 "问题 1/4" 或 "问题 1/10" |
| 1.2.3 | 维度分布正确 | 启动考核后检查各维度题目数 | 技术人员: PROMPT/LLM/IDE/DEV_PATTERN各至少1题; 非技术: 无IDE/DEV_PATTERN |
### 1.3 P2 新功能验证
| # | 测试场景 | 步骤 | 预期结果 |
|---|---------|------|---------|
| 1.3.1 | 标记回头检查 | 答题中点击🏷️按钮 | 导航点变黄色 |
| 1.3.2 | 提交确认弹窗 | 答部分题后点提交 | 弹出确认弹窗 |
| 1.3.3 | 进度导航点 | 观察题号指示 | 当前题蓝色,其他灰色 |
---
## Phase 2: 评分与证书(优先级 P1)
### 2.1 评分正确性
| # | 测试场景 | 步骤 | 预期结果 |
|---|---------|------|---------|
| 2.1.1 | 考核完成有分数 | 走完完整考核 | finalScore ≠ undefined, 为 0-10 之间的数字 |
| 2.1.2 | 等级判定 | 检查结果页等级字段 | Proficient / Novice / Advanced / Expert |
| 2.1.3 | 合格/不合格判定 | 根据 passingScore 判断 | 分数≥及格线 → passed=true |
### 2.2 证书
| # | 测试场景 | 步骤 | 预期结果 |
|---|---------|------|---------|
| 2.2.1 | 查看证书 | 完成页点击"查看证书" | 弹窗显示等级、总分、维度得分 |
| 2.2.2 | 证书 API | GET /api/assessment/:id/certificate | 返回 certificate 对象 |
| 2.2.3 | 历史记录 | 完成考核后查看历史侧栏 | 新纪录出现在列表 |
### 2.3 导出
| # | 测试场景 | 步骤 | 预期结果 |
|---|---------|------|---------|
| 2.3.1 | PDF 导出 | 完成页下载 PDF | 触发文件下载或新窗口 |
| 2.3.2 | Excel 导出 | 完成页导出 | 触发文件下载 |
---
## Phase 3: 权限隔离(优先级 P1
### 3.1 角色级权限
| # | 测试场景 | 步骤 | 预期结果 |
|---|---------|------|---------|
| 3.1.1 | USER 查看考核页 | user1 登录 → 进入考核 | 能看到模板,能参加考核 |
| 3.1.2 | USER 不能管理模板 | user1 → 设置页 | 没有"测评模板" Tab |
| 3.1.3 | TA 管理模板 | ta_admin → 设置页 | 有"测评模板" Tab |
| 3.1.4 | TA 创建模板 | ta_admin API 调用 | POST /api/assessment/templates 成功 |
### 3.2 会话隔离
| # | 测试场景 | 步骤 | 预期结果 |
|---|---------|------|---------|
| 3.2.1 | 不可查看他人会话 | USER 查他人的 session/state | 404 或 Forbidden |
| 3.2.2 | 不可强制结束他人会话 | USER 调 force-end 他人 session | 403 或 404 |
---
## Phase 4: 压力与异常(优先级 P2)
### 4.1 并发
| # | 测试场景 | 步骤 | 预期结果 |
|---|---------|------|---------|
| 4.1.1 | 10人同时开启考核 | 并发 POST /assessment/start | Session ID 全部唯一 |
| 4.1.2 | 10人同时提交答案 | 并发 POST /assessment/:id/answer | 全部成功,无数据竞争 |
### 4.2 异常输入
| # | 测试场景 | 步骤 | 预期结果 |
|---|---------|------|---------|
| 4.2.1 | 空模板 ID 启动 | POST /assessment/start 不带 templateId | 400 Bad Request |
| 4.2.2 | 不存在的模板 ID | POST /assessment/start 用假 templateId | 400 或 404 |
| 4.2.3 | 不存在的 Session 答题 | POST /assessment/fake/answer | 404 |
| 4.2.4 | 用已完成的 Session 答题 | 完成后再次 POST answer | 400 或适当错误 |
### 4.3 状态冲突
| # | 测试场景 | 步骤 | 预期结果 |
|---|---------|------|---------|
| 4.3.1 | 重复开始考核(同一用户同一模板) | 连续2次 start | 第二次可能失败或开新会话 |
| 4.3.2 | 强制结束不存在的会话 | POST /assessment/fake/force-end | 404 |
---
## Phase 5: 完整回归测试(优先级 P2)
合并已有的 3 个测试脚本,确保不重复:
| 脚本 | 说明 | 是否纳入 |
|------|------|---------|
| test-systematic.mjs | 142 项系统测试 | ✅ 保留,不重复 |
| test-p2-advanced.mjs | P2 高级功能 20 项 | ✅ 合并入本方案的 Phase 1.3 |
| test-full-coverage.mjs | 全量回归 52 项 | ✅ 保留,不重复 |
| test-concurrent-assessments.mjs | 并发测试 | ✅ 合并入 Phase 4.1 |
---
## 实施计划
```
Step 1: 跑一轮快速烟雾测试 → 发现当前故障
Step 2: 修复 Phase 1 中的阻断性问题
Step 3: 编写自动化测试脚本(分阶段)
Step 4: 执行完整测试 → 修复剩余问题
Step 5: 纳入 CI/手动定期运行
```