2026-03-13 13:48:28 +08:00
|
|
|
|
# 课程包三端全链路测试记录
|
|
|
|
|
|
|
|
|
|
|
|
**测试日期**: 2026-03-13
|
|
|
|
|
|
**测试类型**: API 全链路功能测试
|
|
|
|
|
|
**测试结果**: ✅ 全部通过
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 测试概述
|
|
|
|
|
|
|
|
|
|
|
|
本次测试针对课程包业务从超管端创建到学校端查看、教师端查看课程的完整 API 链路进行功能验证。
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 测试结果汇总
|
|
|
|
|
|
|
|
|
|
|
|
| 阶段 | 测试项 | 状态 |
|
|
|
|
|
|
|------|--------|------|
|
|
|
|
|
|
| 超管端 | 登录功能 | ✅ 通过 |
|
|
|
|
|
|
| 超管端 | 创建课程 | ✅ 通过 |
|
|
|
|
|
|
| 超管端 | 发布课程 | ✅ 通过 |
|
|
|
|
|
|
| 超管端 | 创建套餐 | ✅ 通过 |
|
|
|
|
|
|
| 超管端 | 添加课程到套餐 | ✅ 通过 |
|
|
|
|
|
|
| 超管端 | 提交审核 | ✅ 通过 |
|
|
|
|
|
|
| 超管端 | 审核通过 | ✅ 通过 |
|
|
|
|
|
|
| 超管端 | 发布套餐 | ✅ 通过 |
|
|
|
|
|
|
| 超管端 | 授权给租户 | ✅ 通过 |
|
|
|
|
|
|
| 学校端 | 登录功能 | ✅ 通过 |
|
|
|
|
|
|
| 学校端 | 查看授权套餐 | ✅ 通过 |
|
|
|
|
|
|
| 教师端 | 登录功能 | ✅ 通过 |
|
|
|
|
|
|
| 教师端 | 查看可用课程 | ✅ 通过 |
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 测试流程
|
|
|
|
|
|
|
|
|
|
|
|
### 第一阶段:超管端
|
|
|
|
|
|
|
|
|
|
|
|
1. **登录** (POST `/api/auth/login`)
|
|
|
|
|
|
- 请求: `{"role": "admin", "username": "admin", "password": "123456"}`
|
|
|
|
|
|
- 响应: 200 OK, token 返回成功
|
|
|
|
|
|
|
|
|
|
|
|
2. **创建课程** (POST `/api/admin/courses`)
|
|
|
|
|
|
- 课程 ID: 14
|
|
|
|
|
|
- 课程名称: 测试课程_1773380715
|
|
|
|
|
|
- 状态: draft → published
|
|
|
|
|
|
|
|
|
|
|
|
3. **发布课程** (POST `/api/admin/courses/{id}/publish`)
|
|
|
|
|
|
- 响应: 200 OK
|
|
|
|
|
|
- 课程状态变为 published
|
|
|
|
|
|
|
|
|
|
|
|
4. **创建套餐** (POST `/api/v1/admin/packages`)
|
|
|
|
|
|
- 套餐 ID: 9
|
|
|
|
|
|
- 套餐名称: 全链路测试套餐_1773380715
|
|
|
|
|
|
- 状态: DRAFT
|
|
|
|
|
|
|
|
|
|
|
|
5. **添加课程到套餐** (PUT `/api/v1/admin/packages/{id}/courses`)
|
|
|
|
|
|
- 课程 ID: 14
|
|
|
|
|
|
- 响应: 200 OK
|
|
|
|
|
|
|
|
|
|
|
|
6. **提交审核** (POST `/api/v1/admin/packages/{id}/submit`)
|
|
|
|
|
|
- 响应: 200 OK
|
|
|
|
|
|
- 套餐状态: DRAFT → SUBMITTED
|
|
|
|
|
|
|
|
|
|
|
|
7. **审核通过** (POST `/api/v1/admin/packages/{id}/review`)
|
|
|
|
|
|
- 请求: `{"approved": true, "comment": "自动化测试审核通过"}`
|
|
|
|
|
|
- 响应: 200 OK
|
|
|
|
|
|
- 套餐状态: SUBMITTED → APPROVED
|
|
|
|
|
|
|
|
|
|
|
|
8. **发布套餐** (POST `/api/v1/admin/packages/{id}/publish`)
|
|
|
|
|
|
- 响应: 200 OK
|
|
|
|
|
|
- 套餐状态: APPROVED → PUBLISHED
|
|
|
|
|
|
|
|
|
|
|
|
9. **授权给租户** (POST `/api/v1/admin/packages/{id}/grant`)
|
|
|
|
|
|
- 租户 ID: 1
|
|
|
|
|
|
- 授权期限: 2027-03-13
|
|
|
|
|
|
- 响应: 200 OK
|
|
|
|
|
|
|
|
|
|
|
|
### 第二阶段:学校端
|
|
|
|
|
|
|
|
|
|
|
|
1. **登录** (POST `/api/auth/login`)
|
|
|
|
|
|
- 请求: `{"role": "school", "username": "school1", "password": "123456"}`
|
|
|
|
|
|
- 响应: 200 OK
|
|
|
|
|
|
|
|
|
|
|
|
2. **查看授权套餐** (GET `/api/school/packages`)
|
|
|
|
|
|
- 响应: 200 OK
|
|
|
|
|
|
- 返回租户套餐列表(包含套餐 ID 9)
|
|
|
|
|
|
|
|
|
|
|
|
### 第三阶段:教师端
|
|
|
|
|
|
|
|
|
|
|
|
1. **登录** (POST `/api/auth/login`)
|
|
|
|
|
|
- 请求: `{"role": "teacher", "username": "teacher1", "password": "123456"}`
|
|
|
|
|
|
- 响应: 200 OK
|
|
|
|
|
|
|
|
|
|
|
|
2. **查看可用课程** (GET `/api/teacher/courses`)
|
|
|
|
|
|
- 响应: 200 OK
|
|
|
|
|
|
- 返回课程列表(包含课程 ID 14)
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Bug 修复记录
|
|
|
|
|
|
|
|
|
|
|
|
### Bug 1: 登录 API 路径错误
|
|
|
|
|
|
- **问题**: 测试脚本使用 `/api/v1/auth/login`,实际路径是 `/api/auth/login`
|
|
|
|
|
|
- **修复**: 更新测试脚本
|
|
|
|
|
|
|
|
|
|
|
|
### Bug 2: 角色名称大小写错误
|
|
|
|
|
|
- **问题**: 测试脚本使用 `"role": "ADMIN"`,枚举要求小写 `"admin"`
|
|
|
|
|
|
- **修复**: 更新测试脚本使用小写角色名
|
|
|
|
|
|
|
|
|
|
|
|
### Bug 3: 测试账号密码错误
|
2026-03-14 16:50:54 +08:00
|
|
|
|
- **问题**: 测试脚本使用 `123456`,数据库初始化为 `123456`
|
2026-03-13 13:48:28 +08:00
|
|
|
|
- **修复**: 更新测试脚本使用正确密码
|
|
|
|
|
|
|
|
|
|
|
|
### Bug 4: 套餐提交审核必须包含课程
|
|
|
|
|
|
- **问题**: 提交审核时报错 "套餐必须包含至少一个课程包"
|
|
|
|
|
|
- **修复**: 先创建课程,再添加到套餐,然后提交审核
|
|
|
|
|
|
|
|
|
|
|
|
### Bug 5: 学校端 API 路径错误
|
|
|
|
|
|
- **问题**: 测试脚本使用 `/api/v1/school/packages`,实际路径是 `/api/school/packages`
|
|
|
|
|
|
- **修复**: 更新测试脚本
|
|
|
|
|
|
|
|
|
|
|
|
### Bug 6: 教师端无法看到系统课程
|
|
|
|
|
|
- **问题**: `getCoursePage` 和 `getCoursesByTenantId` 只查询租户自己的课程,不包含系统课程
|
|
|
|
|
|
- **修复**: 修改查询条件,同时包含租户课程和系统课程:
|
|
|
|
|
|
```java
|
|
|
|
|
|
wrapper.and(w -> w
|
|
|
|
|
|
.eq(Course::getTenantId, tenantId)
|
|
|
|
|
|
.or()
|
|
|
|
|
|
.eq(Course::getIsSystem, 1)
|
|
|
|
|
|
);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### Bug 7: 创建系统课程未设置 isSystem 标志
|
|
|
|
|
|
- **问题**: `AdminCourseController.createCourse` 设置了 `isSystem=1` 但没有保存到数据库
|
|
|
|
|
|
- **修复**: 添加 `courseMapper.updateById(course)` 保存到数据库
|
|
|
|
|
|
|
|
|
|
|
|
### Bug 8: 课程需要发布才能被教师端看到
|
|
|
|
|
|
- **问题**: 教师端查询条件 `status = 'published'`,新创建的课程状态是 `draft`
|
|
|
|
|
|
- **修复**: 创建课程后调用发布接口
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 新增功能
|
|
|
|
|
|
|
|
|
|
|
|
### 新增授权接口 (超管端)
|
|
|
|
|
|
- **路径**: `POST /api/v1/admin/packages/{id}/grant`
|
|
|
|
|
|
- **功能**: 授权套餐给指定租户
|
|
|
|
|
|
- **请求参数**:
|
|
|
|
|
|
- `tenantId`: 租户 ID
|
|
|
|
|
|
- `endDate`: 授权结束日期
|
|
|
|
|
|
- `pricePaid`: 支付金额
|
|
|
|
|
|
- **响应**: 200 OK
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 测试脚本
|
|
|
|
|
|
|
|
|
|
|
|
- `test_package_full_api.py`: 完整套餐 API 测试(包含课程创建)
|
|
|
|
|
|
- `test_three_ends.py`: 三端全链路测试
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 下一步计划
|
|
|
|
|
|
|
|
|
|
|
|
1. **前端浏览器测试**: 使用 Playwright 进行前端页面的自动化测试
|
|
|
|
|
|
2. **备课功能测试**: 测试教师端备课、授课功能
|
|
|
|
|
|
3. **展播模式测试**: 测试课程展播模式
|
|
|
|
|
|
4. **数据完整性测试**: 测试套餐中所有字段、所有资源的填写和上传
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
**测试结论**: 课程包三端 API 全链路测试通过,所有核心功能正常运行。
|