# 问卷/考试系统 - UI 功能测试报告

## 测试范围
- 用户端：`/`、`/subjects`、`/tasks`、`/quiz`、`/result/:id`
- 管理端：`/admin/login`、`/admin/dashboard`、`/admin/questions`、`/admin/categories`、`/admin/subjects`、`/admin/tasks`、`/admin/users`（含用户组管理）、`/admin/statistics`、`/admin/backup`、`/admin/config`
- 说明：用户组功能（用户组管理、成员关系、考试任务按组分派与混合选择）已实现但目前标记为“未测试”。

## 测试环境
- 操作系统：Windows
- 前端开发地址：`http://localhost:5173/`
- 后端开发地址：`http://localhost:3001/api`
- 测试时间：2025-12-22

## 测试方法
- 静态代码审查：对页面路由、接口调用、关键交互与边界条件进行逐页核对
- 冒烟检查：启动开发服务后，验证前后端可启动、接口可访问（以实际执行记录为准）

## 结果概览
- 管理端：页面路由与菜单整体完整，但存在少量可达性与安全性问题
- 用户端：存在多处关键交互链路断裂风险（会导致“无法加载科目/任务/无法开始考试/考试页空白”）
- 用户组：实现已落地但缺少覆盖性验证与审计日志能力，需单独做回归测试

## 关键缺陷（建议优先级从高到低）

### P0：用户端关键流程可能不可用
- 用户信息状态来源不一致：`HomePage` 使用 `UserContext` 写入 `localStorage(survey_user)`，但 `SubjectSelectionPage` 与 `UserTaskPage` 使用 `zustand` 的 `useUserStore` 且未从 `localStorage` 恢复，导致 `user?.id` 可能为空，后续生成试卷/拉取任务会失败（见 `src/pages/HomePage.tsx:18`、`src/stores/userStore.ts:16`、`src/pages/SubjectSelectionPage.tsx:38`、`src/pages/UserTaskPage.tsx:28`）。
- API 响应对象使用方式不一致：`src/utils/request.ts` 的响应拦截器会直接返回 `{ success, data }`，但 `SubjectSelectionPage`、`UserTaskPage` 仍按 `axios` 原始响应访问 `response.data.success`，会导致列表不渲染（见 `src/utils/request.ts:14`、`src/pages/SubjectSelectionPage.tsx:55`、`src/pages/UserTaskPage.tsx:39`）。
- 考试页初始化逻辑可能清空题目：`QuizPage` 在设置题目后调用 `clearQuiz()`，而 `clearQuiz()` 会清空 `questions`，可能导致考试页无题可答（见 `src/pages/QuizPage.tsx:51`、`src/contexts/QuizContext.tsx:38`）。

### P1：管理端配置入口可达性问题
- 存在 `/admin/config` 路由，但侧边栏菜单未提供入口，用户只能手工输入 URL 访问（见 `src/App.tsx:58`、`src/layouts/AdminLayout.tsx:29`）。

### P1：鉴权/敏感信息呈现风险（影响上线）
- `adminAuth` 为简化放行逻辑，接口层面的“权限控制”在生产环境不成立（见 `api/middlewares/index.ts` 中 `adminAuth` 实现）。
- 用户密码存在明文存储/展示路径（例如用户管理页面有显示/隐藏密码的 UI），属于上线前必须整改的安全项（见 `src/pages/admin/UserManagePage.tsx:36`）。

### P2：一致性与可维护性问题（影响后续扩展）
- 同一功能域存在两套请求封装（`src/services/api.ts` 与 `src/utils/request.ts`）且返回值约定不同，容易造成新页面复用错误（已在用户端出现）。
- 测试脚本与端口配置不一致：`test/*.js` 默认指向 `http://localhost:3000/api`，与当前后端默认端口 `3001` 不一致，直接运行会误判失败（见 `test/test_openspec_features.js:3`）。

## 建议完善（按收益排序）
- 统一用户态管理：用户端统一使用 `UserContext` 或统一使用 `zustand`，并保证从 `localStorage` 恢复与退出清理一致。
- 统一请求封装与返回类型：优先减少到一个请求层（或保证两者对外返回形态一致），避免页面端误用。
- 修复考试页初始化顺序：确保“清理旧状态”发生在“写入新题目”之前，或仅清理 `answers` 不清理 `questions`。
- 管理端补齐菜单入口：为 `/admin/config` 提供侧边栏入口，避免功能“存在但不可见”。
- 用户组做专项回归：覆盖“全体用户”系统组约束、成员增删、任务按组分派、混合选择去重、报表导出。

## 建议回归用例清单（手工）
- 用户端：新用户登录→进入科目页→选择科目→开始考试→答题提交→结果页展示→返回首页→查看我的任务
- 管理端：登录→题库（导入/新增/编辑/删除/导出）→类别管理→科目配置→任务创建（选用户+选用户组混合）→查看任务报表→用户管理（分组）→备份导出/恢复
