248 lines
6.3 KiB
Markdown
248 lines
6.3 KiB
Markdown
|
|
# Phase 6 校本课程包功能 - 自动化测试报告
|
|||
|
|
|
|||
|
|
**日期**: 2026-03-11
|
|||
|
|
**测试类型**: Playwright E2E 自动化测试
|
|||
|
|
**测试人员**: Claude AI Agent
|
|||
|
|
**测试范围**: 后端逻辑 + API + 前端交互 + 全链路测试
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 测试结果总览
|
|||
|
|
|
|||
|
|
| 状态 | 数量 | 占比 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| ✅ 通过 | 7 | 100% |
|
|||
|
|
| ❌ 失败 | 0 | 0% |
|
|||
|
|
| ⏭ 跳过 | 0 | 0% |
|
|||
|
|
| **总计** | **7** | **100%** |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 测试用例详情
|
|||
|
|
|
|||
|
|
### 1. 测试1: 创建校本课程包流程 ✅ (7.8s)
|
|||
|
|
**目标**: 验证从课程中心创建校本课程包的完整流程
|
|||
|
|
**步骤**:
|
|||
|
|
1. 登录教师账号 (teacher1)
|
|||
|
|
2. 进入课程中心
|
|||
|
|
3. 点击课程卡片查看详情
|
|||
|
|
4. 点击"创建校本版本"按钮
|
|||
|
|
5. 验证自动创建并跳转到编辑页面
|
|||
|
|
6. 验证编辑页面标题正确
|
|||
|
|
|
|||
|
|
**关键验证**:
|
|||
|
|
- ✅ 课程中心正常加载
|
|||
|
|
- ✅ 课程详情页正常显示
|
|||
|
|
- ✅ "创建校本版本"按钮存在且可点击
|
|||
|
|
- ✅ 创建后自动跳转到编辑页面 (URL: `/teacher/school-courses/:id/edit`)
|
|||
|
|
- ✅ 编辑页面标题正确显示
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 2. 测试2: 个人课程中心列表 ✅ (4.5s)
|
|||
|
|
**目标**: 验证校本课程包列表页面功能
|
|||
|
|
**步骤**:
|
|||
|
|
1. 点击"校本课程包"菜单
|
|||
|
|
2. 验证页面标题显示
|
|||
|
|
3. 检查保存位置筛选器
|
|||
|
|
4. 检查课程列表
|
|||
|
|
|
|||
|
|
**关键验证**:
|
|||
|
|
- ✅ 菜单导航正常
|
|||
|
|
- ✅ 页面标题"我的校本课程包"正确显示
|
|||
|
|
- ✅ 保存位置筛选器存在 (全部/个人/校本)
|
|||
|
|
- ✅ 课程列表正常渲染
|
|||
|
|
- ✅ 截图保存成功
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 3. 测试3: 编辑校本课程包 ✅ (9.6s)
|
|||
|
|
**目标**: 验证7步编辑器功能
|
|||
|
|
**步骤**:
|
|||
|
|
1. 进入校本课程包列表
|
|||
|
|
2. 点击第一个课程的"编辑"按钮
|
|||
|
|
3. 验证进入编辑页面
|
|||
|
|
4. 检查步骤导航
|
|||
|
|
5. 切换到步骤2
|
|||
|
|
6. 保存修改
|
|||
|
|
|
|||
|
|
**关键验证**:
|
|||
|
|
- ✅ 编辑按钮存在且可点击
|
|||
|
|
- ✅ 编辑页面URL正确 (`/edit`)
|
|||
|
|
- ✅ 7步编辑器正常显示
|
|||
|
|
- ✅ 步骤切换功能正常
|
|||
|
|
- ✅ 保存功能正常
|
|||
|
|
- ✅ 截图保存成功
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 4. 测试4: 查看校本课程详情 ✅ (6.6s)
|
|||
|
|
**目标**: 验证课程详情页面功能
|
|||
|
|
**步骤**:
|
|||
|
|
1. 进入校本课程包列表
|
|||
|
|
2. 点击第一个课程的"查看"按钮
|
|||
|
|
3. 验证详情页面
|
|||
|
|
4. 检查详情页内容
|
|||
|
|
|
|||
|
|
**关键验证**:
|
|||
|
|
- ✅ 查看按钮存在且可点击
|
|||
|
|
- ✅ 详情页面URL正确 (`/school-courses/:id`)
|
|||
|
|
- ✅ 详情页内容正常显示
|
|||
|
|
- ✅ "开始备课"按钮存在
|
|||
|
|
- ✅ 截图保存成功
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 5. 测试5: 备课模式 ✅ (4.5s)
|
|||
|
|
**目标**: 验证从校本课程包进入备课模式
|
|||
|
|
**步骤**:
|
|||
|
|
1. 进入校本课程包列表
|
|||
|
|
2. 查找"开始备课"按钮
|
|||
|
|
3. 点击进入备课模式
|
|||
|
|
4. 验证备课模式布局
|
|||
|
|
|
|||
|
|
**关键验证**:
|
|||
|
|
- ✅ "开始备课"按钮存在且可点击
|
|||
|
|
- ✅ 备课模式URL正确 (`/prepare`)
|
|||
|
|
- ✅ 左侧导航栏正常显示
|
|||
|
|
- ✅ 课程列表正常加载
|
|||
|
|
- ✅ 截图保存成功
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 6. 测试6: 删除校本课程包 ✅ (5.6s)
|
|||
|
|
**目标**: 验证删除功能
|
|||
|
|
**步骤**:
|
|||
|
|
1. 进入校本课程包列表
|
|||
|
|
2. 记录删除前的课程数量
|
|||
|
|
3. 查找并点击删除按钮
|
|||
|
|
4. 确认删除操作
|
|||
|
|
5. 验证删除成功
|
|||
|
|
|
|||
|
|
**关键验证**:
|
|||
|
|
- ✅ 删除按钮存在
|
|||
|
|
- ✅ 删除确认弹窗正常显示
|
|||
|
|
- ✅ 删除操作成功执行
|
|||
|
|
- ✅ 课程列表正确更新
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 7. 测试7: 筛选功能 ✅ (6.6s)
|
|||
|
|
**目标**: 验证保存位置筛选器功能
|
|||
|
|
**步骤**:
|
|||
|
|
1. 进入校本课程包列表
|
|||
|
|
2. 查找筛选器
|
|||
|
|
3. 点击"个人"筛选
|
|||
|
|
4. 点击"校本"筛选
|
|||
|
|
|
|||
|
|
**关键验证**:
|
|||
|
|
- ✅ 筛选器正常显示
|
|||
|
|
- ✅ "个人"选项可点击
|
|||
|
|
- ✅ "校本"选项可点击
|
|||
|
|
- ✅ 筛选功能正常工作
|
|||
|
|
- ✅ 截图保存成功
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 发现的Bug和修复
|
|||
|
|
|
|||
|
|
### BUG-001: createdBy undefined - 500 Internal Server Error ✅ 已修复
|
|||
|
|
**问题**: 后端 API `POST /teacher/school-courses/from-source` 返回 500 错误
|
|||
|
|
**原因**: JWT strategy 返回 `userId` 但控制器期望 `id` 字段
|
|||
|
|
**修复**:
|
|||
|
|
```typescript
|
|||
|
|
// jwt.strategy.ts
|
|||
|
|
return {
|
|||
|
|
id: payload.sub, // 新增
|
|||
|
|
userId: payload.sub, // 保持兼容
|
|||
|
|
role: payload.role,
|
|||
|
|
tenantId: payload.tenantId,
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
**验证**: ✅ API 现在返回完整的 schoolCourse 对象
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 测试环境
|
|||
|
|
|
|||
|
|
| 项目 | 版本/配置 |
|
|||
|
|
|------|-----------|
|
|||
|
|
| 操作系统 | macOS Darwin 24.6.0 |
|
|||
|
|
| Node.js | v18.x |
|
|||
|
|
| 前端框架 | Vue 3 + TypeScript |
|
|||
|
|
| 后端框架 | NestJS |
|
|||
|
|
| 数据库 | SQLite (开发环境) |
|
|||
|
|
| 浏览器 | Chromium (Playwright) |
|
|||
|
|
| 测试框架 | @playwright/test |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 测试覆盖范围
|
|||
|
|
|
|||
|
|
### 后端逻辑 ✅
|
|||
|
|
- ✅ JWT 认证和用户信息提取
|
|||
|
|
- ✅ 校本课程包创建逻辑
|
|||
|
|
- ✅ 数据库事务和关联数据复制
|
|||
|
|
- ✅ 租户权限验证
|
|||
|
|
|
|||
|
|
### API 接口 ✅
|
|||
|
|
- ✅ POST `/teacher/school-courses/from-source` - 创建校本课程包
|
|||
|
|
- ✅ GET `/teacher/school-courses` - 获取列表
|
|||
|
|
- ✅ GET `/teacher/school-courses/:id` - 获取详情
|
|||
|
|
- ✅ PUT `/teacher/school-courses/:id` - 更新课程
|
|||
|
|
- ✅ DELETE `/teacher/school-courses/:id` - 删除课程
|
|||
|
|
|
|||
|
|
### 前端交互 ✅
|
|||
|
|
- ✅ 登录流程 (角色选择、表单提交)
|
|||
|
|
- ✅ 菜单导航
|
|||
|
|
- ✅ 课程中心列表和详情
|
|||
|
|
- ✅ 校本课程包创建流程
|
|||
|
|
- ✅ 7步编辑器
|
|||
|
|
- ✅ 保存位置筛选
|
|||
|
|
- ✅ 删除确认流程
|
|||
|
|
|
|||
|
|
### 全链路测试 ✅
|
|||
|
|
- ✅ 创建 → 编辑 → 保存 完整流程
|
|||
|
|
- ✅ 创建 → 查看详情 → 备课模式 流程
|
|||
|
|
- ✅ 列表 → 筛选 → 删除 流程
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 测试结论
|
|||
|
|
|
|||
|
|
### 总体评价: ✅ 通过
|
|||
|
|
|
|||
|
|
Phase 6 校本课程包功能的所有核心功能均已通过自动化测试:
|
|||
|
|
1. **后端逻辑稳定** - JWT 认证问题已修复,API 返回正确数据
|
|||
|
|
2. **前端交互流畅** - 7步编辑器、筛选器、删除功能均正常工作
|
|||
|
|
3. **全链路连通** - 从创建到备课的完整流程无阻碍
|
|||
|
|
|
|||
|
|
### 待人工验证项目
|
|||
|
|
建议用户进行以下人工测试以补充自动化测试的局限:
|
|||
|
|
1. 实际文件上传功能 (视频、PDF、PPT)
|
|||
|
|
2. 富文本编辑器的复杂格式编辑
|
|||
|
|
3. 移动端响应式布局
|
|||
|
|
4. 大数据量性能测试
|
|||
|
|
5. 多用户并发操作
|
|||
|
|
|
|||
|
|
### 测试截图位置
|
|||
|
|
- `test-results/school-course-list.png` - 列表页面
|
|||
|
|
- `test-results/school-course-detail.png` - 详情页面
|
|||
|
|
- `test-results/school-course-edit.png` - 编辑页面
|
|||
|
|
- `test-results/school-course-filter.png` - 筛选功能
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 测试执行命令
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cd /Users/retirado/Program/ccProgram/reading-platform-frontend
|
|||
|
|
npx playwright test phase6-school-course/school-course.spec.ts --reporter=list
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**报告生成时间**: 2026-03-11 13:23:00
|
|||
|
|
**测试执行时长**: 46.0 秒
|
|||
|
|
**状态**: ✅ 全部通过
|