压测原因
因为培训系统首页用户量比较多,接口并发量较大,因为2021.06.03出现生产环境崩溃问题,故需要对培训系统需要压测的接口进行整理,主要是对首页的员工端接口进行压力测试
压测接口列表
baseUrlhttp://ip:port/training
课程接口列表
- 🔒 web端首页课程搜索 :
POST {{baseUrl}}/portalCourse/getCourseListByCriteria - 🔒 app端首页课程搜索 :
POST {{baseUrl}}/stuClient/selectPageCenter - 🔒 查询目录树 :
POST {{baseUrl}}/directory/selectDirectoryTree - 🔒 web端首页课程展示 :
GET {{baseUrl}}/portalCourse/home - 🔒 web学员端首页 :
POST {{baseUrl}}/studentCourse/page - 🔒 学员端获取课时详情 :
GET {{baseUrl}}/lesson/getLesson/{lessonId} - 🔒 web学员端课时日志添加 :
POST {{baseUrl}}/student/create/{lessonId} - 🔒 web学员端更新课时状态 :
PUT {{baseUrl}}/lesson/updateProcess - 🔒 web学员端加入学习 :
POST {{baseUrl}}/course/studyCourse/{courseId}
培训接口列表
- 🔒 学员报名接口 :
POST {{baseUrl}}/activity_student/apply - 🔒 学员取消报名接口 :
POST {{baseUrl}}/activity_student/cancel_apply - 🔒 学员签到接口 :
POST {{baseUrl}}/activity_student/sign_in - 🔒 学员端培训活动分页接口 :
POST {{baseUrl}}/activity/student_page - 🔒 学员端培训考试的提交接口 :
POST {{baseUrl}}/activity/submit_exam - 🔒 学员端培训问卷的提交接口 :
POST {{baseUrl}}/activity/submit_questionnaire - 🔒 APP端学员报名接口 :
POST {{baseUrl}}/activity_app/apply - 🔒 APP端学员取消报名接口 :
POST {{baseUrl}}/activity_app/cancel_apply - 🔒 APP端学员签到接口 :
POST {{baseUrl}}/activity_app/sign_in
课程压测接口详情
备注: 线上课程目前上架的数据量在1000+左右,测试环境也需要同步这样的数据量,搜索和日志添加接口重点测试一下压力
web端首页课程搜索
Method : POST
URL : {{baseUrl}}/portalCourse/getCourseListByCriteria
Auth required : True
入参格式
Body :
{"pageSize": 12,"pageNumber": 1,"orderBy": "createTime","keyWord": "","language": "","orderDirection": "desc"}
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 默认值 | 数据类型 |
|---|---|---|---|---|---|
| pageSize | 分页大小 | body | false | 20 | int |
| pageNumber | 分页页码 | body | false | 1 | int |
| orderBy | 排序字段 | body | false | createTime:更新时间 scorce: 评分 studyCount:热度 |
String |
| keyWord | 关键字搜索 | body | false | String | |
| language | 语种 | body | false | 0 中文 1英文 | string |
| orderDirection | 排序方向 | body | false | desc 倒序 asc 正序 | string |
返回示例
{"success": true,"msg": null,"code": 0,"data": {"total": 1065,"size": 12,"pages": 89,"current": 1,"records": [{"id": "337","type": "0","name": "samy新增课程2-6","introduction": "samy新增课程2-6samy新增课程2-6samy新增课程2-6samy新增课程2-6","coverUrl": "","studyCount": 196,"scorce": 0.0,"createTime": "2021-01-07 13:39:15","addStatus": "1","updateTime": "2021-01-07 13:41:23.0","lecturerVos": [{"id": "9","lecturerPicture": "https://oss-dev.quectel.com/group1/M00/00/02/wKgKal-_jM-AN31KAAGKs9vtzL8355.jpg","legalName": "王晓康","enName": "Kondi Wang","gender": "MALE","type": "RESC3s9ugl0rCZgYlrR","levelCode": "lisid84j7dfhsjd5487","levelName": "中级讲师","status": "Y","typeName": "内部讲师"}]}]}}
app端首页课程搜索
Method : POST
URL : {{baseUrl}}/stuClient/selectPageCenter
Auth required : True
入参格式
Body :
{"pageNumber": 1,"searchFlag": "1","pageSize": 10,"keyWord": "课程","orderBy":"createTime"}
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 默认值 | 数据类型 |
|---|---|---|---|---|---|
| pageSize | 分页大小 | body | false | 20 | int |
| pageNumber | 分页页码 | body | false | 1 | int |
| orderBy | 排序字段 | body | false | createTime:更新时间 scorce: 评分 studyCount:热度 |
String |
| keyWord | 关键字搜索 | body | false | String | |
| searchFlag | 是否为搜索页面 | body | false |
返回示例
{"success": true,"msg": null,"code": 0,"data": {"total": 1121,"size": 10,"pages": 113,"current": 1,"records": [{"id": "536","type": "0","name": "samy-测试讲师渲染课程001","introduction": "1","coverUrl": "","studyCount": 2,"scorce": 5.0,"createTime": null,"addStatus": "0","updateTime": "2021-05-26 16:12:14"}]}}
查询目录树
Method : POST
URL : {{baseUrl}}/directory/selectDirectoryTree
Auth required : True
入参格式
Body :
{"studyId": 337,"type": "0"}
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 默认值 | 数据类型 |
|---|---|---|---|---|---|
| studyId | 课程/微课/学习计划id | body | false | long | |
| type | 类型 | body | false | 0 课程 1 微课 2 学习计划 |
String |
返回示例*
{"success": true,"msg": null,"code": 0,"data": [{"id": "1378","parentId": null,"name": "视频1","typeCode": "2","fileId": "1511","fileCode": "61749bc7bf76f7b7201799c9f9f34b76","fileUrl": "{\"LD\": \"http://oss-dev.quectel.com/group1/M00/00/3E/wKgKal_2npmAIgtkAAABaVOAxi850.m3u8\", \"OD\": \"http://oss-dev.quectel.com/group1/M00/00/3E/wKgKal_2npmAF7ITAAABaRpKQyE32.m3u8\"}","fileName": "1607391261625.mp4","examExerciseId": null,"cover": "","studyStatus": "2","lessonType": "0","studyId": "337","type": "0","sort": "1","score": 0.0,"scoreRate": null,"viewTime": "1","time": "","completeCount": null,"transStatus": "NORMAL","index": null,"children": []}]}
web端首页课程展示
Method : GET
URL : {{baseUrl}}/portalCourse/home
Auth required : True
入参格式
Body :无
返回示例
{"success": true,"msg": null,"code": 0,"data": {"microVideoLists": [{"id": "49","type": "1","name": "很厉害的微课","introduction": "你好","coverUrl": "","studyCount": null,"scorce": 0.0,"createTime": "2021-01-13 13:21:21","addStatus": "0","updateTime": "2021-01-14 15:40:09","lecturerVos": []}],"newCourseLists": [{"id": "422","type": "0","name": "新增课程1","introduction": "新增课程1新增课程1","coverUrl": "","studyCount": 1,"scorce": 0.0,"createTime": "2021-05-06 15:42:05","addStatus": "0","updateTime": "2021-05-10 14:04:15.0","lecturerVos": [{"id": "8","lecturerPicture": "https://oss-dev.quectel.com/group1/M00/00/23/wKgKal_j-XyATKx8AAEbNxOVJMw263.jpg","legalName": "刘谢霞","enName": "Levana Liu","gender": "FEMALE","type": "RESC3s9ugl0rCZgYlrR","levelCode": "usUYOia8ToXdyCz5om2","levelName": "高级讲师","status": "Y","typeName": "内部讲师"}]}],"hotCourseLists": [{"id": "337","type": "0","name": "samy新增课程2-6","introduction": "samy新增课程2-6samy新增课程2-6samy新增课程2-6samy新增课程2-6","coverUrl": "","studyCount": 196,"scorce": 0.0,"createTime": "2021-01-07 13:39:15","addStatus": "0","updateTime": "2021-01-07 13:41:23.0","lecturerVos": [{"id": "9","lecturerPicture": "https://oss-dev.quectel.com/group1/M00/00/02/wKgKal-_jM-AN31KAAGKs9vtzL8355.jpg","legalName": "王晓康","enName": "Kondi Wang","gender": "MALE","type": "RESC3s9ugl0rCZgYlrR","levelCode": "lisid84j7dfhsjd5487","levelName": "中级讲师","status": "Y","typeName": "内部讲师"}]}]}}
web学员端首页
Method : POST
URL : {{baseUrl}}/studentCourse/page
Auth required : True
入参格式
Body :
{"keyWord": "","status": "all","studyType": "all","pageSize": 10,"pageNumber": 1}
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 默认值 | 数据类型 |
|---|---|---|---|---|---|
| keyWord | 关键字搜索 | body | false | string | |
| status | 状态 | body | false | 0 未学习 1 学习中 2 学习完成 all 全部 |
string |
| studyType | 类型 | body | false | 0 自学 1 学习计划 all 全部 |
string |
| pageSize | 分页大小 | body | false | 1 | int |
| pageNumber | 页码 | body | false | 20 | int |
返回示例
{"success": true,"msg": null,"code": 0,"data": {"total": 22,"size": 10,"pages": 3,"current": 1,"records": [{"id": "43","type": "1","name": "9206平台定位功能介绍+","introduction": "9206平台定位功能介绍+","coverUrl": "https://oss-dev.quectel.com/group1/M00/00/27/wKgKal_ldm2ADOvSAAcgwBgmuCI383.png","studyCount": 0,"scorce": null,"createTime": "2020-12-25 15:38:18","addStatus": null,"updateTime": null,"lecturerVos": [],"studyType": "0","status": "1","totalCount": 1,"completeRate": null,"clickTime": null,"incrementalLessonCount": null,"changeType": null}]}}
web学员端获取课时详情
Method : GET
URL : {{baseUrl}}/lesson/getLesson/{lessonId}
URL Parameters : lessonId=[string] lessonId 是课时id
Auth required : True
入参格式
返回示例
{"success": true,"msg": null,"code": 0,"data": {"id": "789","directoryId": "1208","studyId": "43","studyType": "1","name": "9206平台定位功能介绍+","fileId": "1211","fileUrl": "{\"LD\": \"http://oss-dev.quectel.com/group1/M00/00/27/wKgKal_leGWAA5FgAAAOLv5m4O427.m3u8\", \"OD\": \"http://oss-dev.quectel.com/group1/M00/00/27/wKgKal_leGOAUWngAAAOLuzQxlY01.m3u8\"}","fileName": "9206平台定位功能介绍+.mp4","transStatus": "NORMAL","examExerciseId": null,"cover": "http://oss-dev.quectel.com/group1/M00/00/27/wKgKal_ldqCAYCPNAAcgwBgmuCI281.png","score": 2.0,"time": "6062","viewTime": "50","type": "0","contentType": "video/mp4","studyStatus": "1","submitId": null,"fileCode": "af4d67aae5eb0853aa9db422141ab248"}}
web学员端课时日志添加
Method : POST
URL : {{baseUrl}}/student/create/{lessonId}
URL Parameters : lessonId=[string] lessonId 是课时id
Auth required : True
返回示例
{"success": true,"msg": null,"code": 0,"data": true}
web学员端更新课时状态
Method : PUT
URL : {{baseUrl}}/lesson/updateProcess
Auth required : True
入参格式
Body :
{"lessonId": "","type": "2"}
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 默认值 | 数据类型 |
|---|---|---|---|---|---|
| lessonId | 关键字搜索 | body | false | 课时id | long |
| type | 操作类型 | body | false | 0 开始学习; 1 学习中(未学完); 2 学习结束 |
string |
返回示例*
{"success": true,"msg": null,"code": 0,"data": true}
web学员端加入学习
Method : POST
URL : {{baseUrl}}/course/studyCourse/{courseId}
URL Parameters : courseId=[string] courseId 是课程id
Auth required : True
返回示例
{"success": true,"msg": null,"code": 0,"data": true}
培训压测接口详情
学员报名接口
Method : POST
URL : {{baseUrl}}/activity_student/apply
Auth required : True
接口说明
学员端web页面报名的接口
入参格式
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 默认值 | 限制 | 数据类型 |
|---|---|---|---|---|---|---|
| id | 活动分类id | parameter | false | 字符长度[1, 50] | long |
返回示例
{"success": true,"msg": null,"code": 0,"data": ""}
返回参数
| 参数名称 | 参数说明 | 数据类型 |
|---|---|---|
| success | true成功 false失败 | boolean |
如何压测
不同用户登录的账号去报名同一个活动,或者不同的人去报名不同的活动。或者同一个用户报名活动。
学员取消报名接口
Method : POST
URL : {{baseUrl}}/activity_student/cancel_apply
Auth required : True
接口说明
学员端web页面取消报名的接口
入参格式
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 默认值 | 限制 | 数据类型 |
|---|---|---|---|---|---|---|
| id | 活动分类id | parameter | false | 字符长度[1, 50] | long |
返回示例
{"success": true,"msg": null,"code": 0,"data": ""}
返回参数
| 参数名称 | 参数说明 | 数据类型 |
|---|---|---|
| success | true成功 false失败 | boolean |
如何压测
不同用户登录的账号去取消报名同一个培训活动或者不同的培训活动。或者同一个用户取消报名活动。
学员签到接口
Method : POST
URL : {{baseUrl}}/activity_student/sign_in
Auth required : True
接口说明
学员端web页面签到的接口
入参格式
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 默认值 | 限制 | 数据类型 |
|---|---|---|---|---|---|---|
| id | 活动分类id | parameter | false | 字符长度[1, 50] | long |
返回示例
{"success": true,"msg": null,"code": 0,"data": ""}
返回参数
| 参数名称 | 参数说明 | 数据类型 |
|---|---|---|
| success | true成功 false失败 | boolean |
如何压测
不同用户登录的账号去签到同一个活动,或者不同的人去签到不同的活动。或者同一个用户签到活动。
学员端培训活动分页接口
Method : POST
URL : {{baseUrl}}/activity/student_page
Auth required : True
接口说明
学员端培训活动分页的接口
Body :
{"categoryId": "活动分类id","name": "活动名称","status": "活动状态","startTime": "活动开始时间","endTime": "活动结束时间","pageSize": "每页数据条数","pageNumber": "分页页码",}
入参格式
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 默认值 | 限制 | 数据类型 |
|---|---|---|---|---|---|---|
| categoryId | 活动分类id | body | false | 字符长度[1, 50] | long | |
| name | 活动名称 | body | false | 字符长度[1, 50] | string | |
| status | 活动状态 | body | false | 字符长度[1, 20] | string | |
| startTime | 活动开始时间 | body | false | 字符长度[1, 50] | long | |
| endTime | 活动结束时间 | body | false | 字符长度[1, 50] | long | |
| pageSize | 每页数据条数 | body | false | 30 | int | |
| pageNumber | 分页页码 | body | false | 1 | int |
返回示例
{"success": true,"msg": null,"code": 0,"data": {"total": 1,"size": 10,"pages": 1,"current": 1,"records": [{"id": "108","name": "容器化介绍","categoryId": null,"categoryName": null,"locationNames": "HF-12F-Jakarta","lecturerNames": null,"coverUrl": "","description": "1、docker介绍\n2、kubernetes介绍\n3、业务与容器化集成\n4、安装及答疑","startTime": "2021-03-10 18:30:00","endTime": "2021-03-10 20:30:00","status": "END","activityType": "apply","activityStatus": "late","applyCount": 24,"evaluateCount": null,"examPaperId": null,"questionnaireId": "190","cancelApplyType": false,"signInType": false,"examType": false,"questionnaireType": false,"examPaperAnswerId": null,"questionnaireAnswerId": "1227"}]}
返回参数
| 参数名称 | 参数说明 | 数据类型 |
|---|---|---|
| data | 返回查询对象 | object |
如何压测
用账号登录token分页查询培训活动的分页接口即可。
学员端培训考试的提交接口
Method : POST
URL : {{baseUrl}}/activity/submit_exam
Auth required : True
接口说明
学员端培训考试的提交的接口
Body :
{"activityId": "培训id","examId": "考试id","startTime": "答题开始时间","endTime": "答题结束时间","duration": "答题持续时间","answers": "答案列表",}
入参格式
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 默认值 | 限制 | 数据类型 |
|---|---|---|---|---|---|---|
| activityId | 培训id | body | true | 1 | 字符长度[1, 50] | long |
| examId | 考试id | body | true | 1 | 字符长度[1, 50] | long |
| startTime | 答题开始时间 | body | true | 10 | 字符长度[1, 50] | long |
| endTime | 答题结束时间 | body | true | 10 | 字符长度[1, 50] | long |
| duration | 答题持续时间 | body | true | 10 | long | |
| answers | 答案列表集合 | body | true | [{},{}] | list |
返回示例
{"success": true,"msg": null,"code": 0,"data": ""
返回参数
| 参数名称 | 参数说明 | 数据类型 |
|---|---|---|
| success | true成功 false失败 | boolean |
如何压测
用不同账户登录获取的token值去提交考试答案压测
学员端培训问卷的提交接口
Method : POST
URL : {{baseUrl}}/activity/submit_questionnaire
Auth required : True
接口说明
学员端培训问卷的提交的接口
Body :
{"activityId": "培训id","releaseId": "问卷发布id","startTime": "答题开始时间","endTime": "答题结束时间","duration": "答题持续时间","answers": "答案列表",}
入参格式
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 默认值 | 限制 | 数据类型 |
|---|---|---|---|---|---|---|
| activityId | 培训id | body | true | 1 | 字符长度[1, 50] | long |
| releaseId | 问卷发布id | body | true | 1 | 字符长度[1, 50] | long |
| startTime | 答题开始时间 | body | true | 10 | 字符长度[1, 50] | long |
| endTime | 答题结束时间 | body | true | 10 | 字符长度[1, 50] | long |
| duration | 答题持续时间 | body | true | 10 | long | |
| answers | 答案列表集合 | body | true | [{},{}] | list |
返回示例
{"success": true,"msg": null,"code": 0,"data": ""
返回参数
| 参数名称 | 参数说明 | 数据类型 |
|---|---|---|
| success | true成功 false失败 | boolean |
如何压测
用不同账户登录获取的token值去提交问卷压测
APP端学员报名接口
Method : POST
URL : {{baseUrl}}/activity_app/apply
Auth required : True
接口说明
APP端学员报名的接口
入参格式
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 默认值 | 限制 | 数据类型 |
|---|---|---|---|---|---|---|
| id | 活动分类id | parameter | false | 字符长度[1, 50] | long |
返回示例
{"success": true,"msg": null,"code": 0,"data": ""}
返回参数
| 参数名称 | 参数说明 | 数据类型 |
|---|---|---|
| success | true成功 false失败 | boolean |
如何压测
不同用户登录的账号去报名同一个活动,或者不同的人去报名不同的活动。或者同一个用户报名活动。
APP端学员取消报名接口
Method : POST
URL : {{baseUrl}}/activity_app/cancel_apply
Auth required : True
接口说明
APP端学员取消报名的接口
入参格式
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 默认值 | 限制 | 数据类型 |
|---|---|---|---|---|---|---|
| id | 活动分类id | parameter | false | 字符长度[1, 50] | long |
返回示例
{"success": true,"msg": null,"code": 0,"data": ""}
返回参数
| 参数名称 | 参数说明 | 数据类型 |
|---|---|---|
| success | true成功 false失败 | boolean |
如何压测
不同用户登录的账号去取消报名同一个培训活动或者不同的培训活动。或者同一个用户取消报名活动。
APP端学员签到接口
Method : POST
URL : {{baseUrl}}/activity_app/sign_in
Auth required : True
接口说明
APP端学员签到的接口
入参格式
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 默认值 | 限制 | 数据类型 |
|---|---|---|---|---|---|---|
| id | 活动分类id | parameter | false | 字符长度[1, 50] | long |
返回示例
{"success": true,"msg": null,"code": 0,"data": ""}
返回参数
| 参数名称 | 参数说明 | 数据类型 |
|---|---|---|
| success | true成功 false失败 | boolean |
如何压测
不同用户登录的账号去签到同一个活动,或者不同的人去签到不同的活动。或者同一个用户签到活动。
