217 lines
4.8 KiB
Markdown
217 lines
4.8 KiB
Markdown
|
|
# 全面测试记录 - 2026-03-21
|
|||
|
|
|
|||
|
|
## 测试环境
|
|||
|
|
|
|||
|
|
| 服务 | 端口 | 状态 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| 后端 API | 8481 | ✅ 正常运行 |
|
|||
|
|
| 前端 Dev Server | 5174 | ✅ 正常运行 |
|
|||
|
|
| 数据库 MySQL | 3306 | ✅ 正常连接 |
|
|||
|
|
| Redis | 6379 | ✅ 正常连接 |
|
|||
|
|
|
|||
|
|
## 测试范围
|
|||
|
|
|
|||
|
|
本次提交包含以下新功能:
|
|||
|
|
1. 教师端数据看板功能
|
|||
|
|
2. 学校端课程使用统计功能
|
|||
|
|
3. 个人中心功能(修改资料、修改密码)
|
|||
|
|
4. 前后端 API 类型对齐
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 测试结果
|
|||
|
|
|
|||
|
|
### 1. 超管端 Dashboard 功能 ✅
|
|||
|
|
|
|||
|
|
**测试接口**: `GET /api/v1/admin/stats`
|
|||
|
|
|
|||
|
|
**测试账号**: admin / 123456
|
|||
|
|
|
|||
|
|
**测试结果**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 200,
|
|||
|
|
"message": "操作成功",
|
|||
|
|
"data": {
|
|||
|
|
"totalTenants": "4",
|
|||
|
|
"activeTenants": "4",
|
|||
|
|
"totalTeachers": "12",
|
|||
|
|
"totalStudents": "42",
|
|||
|
|
"totalCourses": "26",
|
|||
|
|
"totalLessons": "29",
|
|||
|
|
"monthlyLessons": "4"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**结论**: ✅ 接口正常,数据返回正确
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 2. 教师端数据看板功能 ✅
|
|||
|
|
|
|||
|
|
**测试接口**: `GET /api/v1/teacher/dashboard`
|
|||
|
|
|
|||
|
|
**测试账号**: teacher1 / 123456
|
|||
|
|
|
|||
|
|
**测试结果**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 200,
|
|||
|
|
"message": "操作成功",
|
|||
|
|
"data": {
|
|||
|
|
"stats": {
|
|||
|
|
"classCount": "8",
|
|||
|
|
"studentCount": "40",
|
|||
|
|
"courseCount": "0",
|
|||
|
|
"lessonCount": "31"
|
|||
|
|
},
|
|||
|
|
"todayLessons": [],
|
|||
|
|
"recommendedCourses": [],
|
|||
|
|
"weeklyStats": {
|
|||
|
|
"lessonCount": "31",
|
|||
|
|
"studentParticipation": 85,
|
|||
|
|
"avgRating": 4.5,
|
|||
|
|
"totalDuration": 300
|
|||
|
|
},
|
|||
|
|
"recentActivities": []
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**测试接口**: `GET /api/v1/teacher/course-usage-stats?periodType=MONTH`
|
|||
|
|
|
|||
|
|
**测试结果**:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 200,
|
|||
|
|
"message": "操作成功",
|
|||
|
|
"data": [
|
|||
|
|
{
|
|||
|
|
"coursePackageId": "17",
|
|||
|
|
"coursePackageName": "课程简介课程简介课程简介课程简介课程简介课程简介课程简介",
|
|||
|
|
"usageCount": 15,
|
|||
|
|
"studentCount": 5,
|
|||
|
|
"avgDuration": 0,
|
|||
|
|
"lastUsedAt": "2026-03-16T00:00:00"
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"coursePackageId": "16",
|
|||
|
|
"coursePackageName": "T 色他",
|
|||
|
|
"usageCount": 1,
|
|||
|
|
"studentCount": 0,
|
|||
|
|
"avgDuration": 0,
|
|||
|
|
"lastUsedAt": "2026-03-16T00:00:00"
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**结论**: ✅ 接口正常,数据返回正确
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 3. 学校端课程统计功能 ⚠️
|
|||
|
|
|
|||
|
|
**测试接口**: `GET /api/v1/school/stats/courses`
|
|||
|
|
|
|||
|
|
**测试账号**: school1 / 123456
|
|||
|
|
|
|||
|
|
**测试结果**: Token 验证失败
|
|||
|
|
|
|||
|
|
**问题**: Token 验证失败,无法完成测试
|
|||
|
|
|
|||
|
|
**原因分析**:
|
|||
|
|
- JWT Token 签名验证失败
|
|||
|
|
- 可能是后端重启导致密钥不一致
|
|||
|
|
- 或者 Redis 中存储的 token 与验证时使用的密钥不匹配
|
|||
|
|
|
|||
|
|
**解决方案**: 需要修复 JWT Token 验证问题
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 4. 个人中心功能 ⚠️
|
|||
|
|
|
|||
|
|
**测试接口**:
|
|||
|
|
- `GET /api/v1/auth/profile` - 获取个人信息
|
|||
|
|
- `PUT /api/v1/auth/profile` - 修改个人信息
|
|||
|
|
- `POST /api/v1/auth/change-password` - 修改密码
|
|||
|
|
|
|||
|
|
**测试结果**: Token 验证失败,无法完成测试
|
|||
|
|
|
|||
|
|
**问题**: 与学校端相同,Token 验证失败
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 5. E2E 自动化测试 ⚠️
|
|||
|
|
|
|||
|
|
**测试命令**: `npm run test:e2e`
|
|||
|
|
|
|||
|
|
**测试结果**:
|
|||
|
|
- 登录测试:部分通过
|
|||
|
|
- Dashboard 测试:部分失败(超时、选择器匹配问题)
|
|||
|
|
- 课程包管理测试:失败(页面跳转后浏览器被关闭)
|
|||
|
|
|
|||
|
|
**失败原因**:
|
|||
|
|
1. 测试超时(30 秒)
|
|||
|
|
2. 正则表达式匹配多个元素
|
|||
|
|
3. 浏览器实例不稳定
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 问题总结
|
|||
|
|
|
|||
|
|
### 高优先级
|
|||
|
|
|
|||
|
|
1. **JWT Token 验证失败**
|
|||
|
|
- 影响范围:所有需要认证的接口
|
|||
|
|
- 现象:登录后立即使用 token 访问接口返回 401
|
|||
|
|
- 日志错误:`JWT signature does not match locally computed signature`
|
|||
|
|
- 可能原因:
|
|||
|
|
- JwtTokenProvider 的 secret 密钥初始化有问题
|
|||
|
|
- @PostConstruct 没有正确执行
|
|||
|
|
- 密钥字符串长度不满足 HS384 算法要求
|
|||
|
|
|
|||
|
|
**修复建议**:
|
|||
|
|
- 检查 JwtTokenProvider 是否正确初始化
|
|||
|
|
- 尝试使用 HS256 算法
|
|||
|
|
- 确保 secret 密钥至少 256 位
|
|||
|
|
|
|||
|
|
### 中优先级
|
|||
|
|
|
|||
|
|
2. **E2E 测试不稳定**
|
|||
|
|
- 增加测试超时时间
|
|||
|
|
- 修复正则表达式选择器
|
|||
|
|
- 添加更稳定的等待条件
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 已验证功能
|
|||
|
|
|
|||
|
|
| 功能模块 | 接口 | 状态 |
|
|||
|
|
|---------|------|------|
|
|||
|
|
| 超管统计 | GET /api/v1/admin/stats | ✅ 通过 |
|
|||
|
|
| 教师 Dashboard | GET /api/v1/teacher/dashboard | ✅ 通过 |
|
|||
|
|
| 教师课程使用统计 | GET /api/v1/teacher/course-usage-stats | ✅ 通过 |
|
|||
|
|
| 学校课程统计 | GET /api/v1/school/stats/courses | ⚠️ Token 问题 |
|
|||
|
|
| 个人信息获取 | GET /api/v1/auth/profile | ⚠️ Token 问题 |
|
|||
|
|
| 个人信息修改 | PUT /api/v1/auth/profile | ⚠️ Token 问题 |
|
|||
|
|
| 修改密码 | POST /api/v1/auth/change-password | ⚠️ Token 问题 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 后续工作
|
|||
|
|
|
|||
|
|
1. 修复 JWT Token 验证问题
|
|||
|
|
2. 完成学校端和个人中心功能测试
|
|||
|
|
3. 修复 E2E 测试用例
|
|||
|
|
4. 更新测试文档
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 测试人员
|
|||
|
|
Claude Code
|
|||
|
|
|
|||
|
|
## 测试时间
|
|||
|
|
2026-03-21
|