盘古用户平台 - 应用管理模块测试用例
| 文档信息 |
内容 |
| 文档版本 |
V1.0 |
| 模块名称 |
应用管理模块 |
| **编写团队 |
pangu |
| 创建日期 |
2026-01-31 |
| 审核状态 |
待评审 |
1. 测试范围
1.1 功能测试
| 测试模块 |
测试内容 |
| 应用列表 |
列表展示、分页、搜索、筛选 |
| 新增应用 |
表单验证、编码生成、密钥生成 |
| 编辑应用 |
数据回显、表单验证、接口授权 |
| 删除应用 |
确认提示、软删除 |
| 重置密钥 |
确认提示、新密钥生成、复制功能 |
| 接口授权 |
授权选择、权限校验 |
1.2 接口测试
| 测试模块 |
测试内容 |
| 管理端接口 |
CRUD接口、权限控制 |
| 开放API |
签名验证、时间戳验证、权限校验 |
1.3 边界测试
| 测试模块 |
测试内容 |
| 输入边界 |
字段长度限制、特殊字符 |
| 业务边界 |
名称重复、空数据处理 |
2. 功能测试用例
2.1 应用列表
| 用例编号 |
TC-APP-001 |
| 用例名称 |
查看应用列表 |
| 前置条件 |
1. 已登录超级管理员账号 2. 数据库有应用数据 |
| 测试步骤 |
1. 点击左侧菜单"应用管理" |
| 预期结果 |
1. 页面正常加载 2. 表格显示应用列表 3. 显示分页信息 |
| 优先级 |
P0 |
| 用例编号 |
TC-APP-002 |
| 用例名称 |
按应用名称搜索 |
| 前置条件 |
1. 已进入应用列表页 2. 数据库有"AI智慧平台"应用 |
| 测试步骤 |
1. 在应用名称输入框输入"AI" 2. 点击搜索按钮 |
| 预期结果 |
1. 列表只显示名称包含"AI"的应用 2. 分页信息正确 |
| 优先级 |
P0 |
| 用例编号 |
TC-APP-003 |
| 用例名称 |
按应用编码搜索 |
| 前置条件 |
1. 已进入应用列表页 2. 数据库有"YY000001"应用 |
| 测试步骤 |
1. 在应用编码输入框输入"YY000001" 2. 点击搜索按钮 |
| 预期结果 |
1. 列表只显示编码匹配的应用 |
| 优先级 |
P0 |
| 用例编号 |
TC-APP-004 |
| 用例名称 |
按状态筛选 |
| 前置条件 |
1. 已进入应用列表页 2. 数据库有正常和停用的应用 |
| 测试步骤 |
1. 状态下拉选择"正常" 2. 点击搜索按钮 |
| 预期结果 |
1. 列表只显示状态为"正常"的应用 |
| 优先级 |
P0 |
| 用例编号 |
TC-APP-005 |
| 用例名称 |
重置查询条件 |
| 前置条件 |
1. 已进入应用列表页 2. 已输入查询条件 |
| 测试步骤 |
1. 点击重置按钮 |
| 预期结果 |
1. 所有查询条件清空 2. 列表显示全部数据 |
| 优先级 |
P1 |
| 用例编号 |
TC-APP-006 |
| 用例名称 |
分页功能 |
| 前置条件 |
1. 已进入应用列表页 2. 数据库有超过10条应用 |
| 测试步骤 |
1. 点击第2页 2. 修改每页条数为20 |
| 预期结果 |
1. 显示第2页数据 2. 每页显示20条 3. 分页信息正确 |
| 优先级 |
P1 |
| 用例编号 |
TC-APP-007 |
| 用例名称 |
授权接口标签展示 |
| 前置条件 |
1. 已进入应用列表页 2. 应用有4个以上授权接口 |
| 测试步骤 |
1. 查看授权接口列 |
| 预期结果 |
1. 显示前3个接口标签 2. 显示"+N"表示剩余数量 |
| 优先级 |
P1 |
2.2 新增应用
| 用例编号 |
TC-APP-010 |
| 用例名称 |
新增应用成功 |
| 前置条件 |
1. 已登录超级管理员账号 2. 已进入应用列表页 |
| 测试步骤 |
1. 点击"新增"按钮 2. 输入应用名称"测试应用" 3. 输入应用描述 4. 输入联系人和电话 5. 选择状态"正常" 6. 勾选2个接口授权 7. 点击"确定" |
| 预期结果 |
1. 提示"新增成功" 2. 弹窗关闭 3. 列表刷新显示新应用 4. 应用编码格式正确(YY+6位序号) |
| 优先级 |
P0 |
| 用例编号 |
TC-APP-011 |
| 用例名称 |
应用名称必填验证 |
| 前置条件 |
1. 已打开新增弹窗 |
| 测试步骤 |
1. 不输入应用名称 2. 点击"确定" |
| 预期结果 |
1. 提示"请输入应用名称" 2. 表单不提交 |
| 优先级 |
P0 |
| 用例编号 |
TC-APP-012 |
| 用例名称 |
应用名称长度验证 |
| 前置条件 |
1. 已打开新增弹窗 |
| 测试步骤 |
1. 输入超过100个字符的应用名称 2. 点击"确定" |
| 预期结果 |
1. 提示"应用名称不能超过100个字符" |
| 优先级 |
P1 |
| 用例编号 |
TC-APP-013 |
| 用例名称 |
应用名称重复验证 |
| 前置条件 |
1. 数据库已有"AI智慧平台"应用 |
| 测试步骤 |
1. 打开新增弹窗 2. 输入应用名称"AI智慧平台" 3. 点击"确定" |
| 预期结果 |
1. 提示"应用名称已存在" |
| 优先级 |
P0 |
| 用例编号 |
TC-APP-014 |
| 用例名称 |
联系电话格式验证 |
| 前置条件 |
1. 已打开新增弹窗 |
| 测试步骤 |
1. 输入应用名称 2. 联系电话输入"12345" 3. 点击"确定" |
| 预期结果 |
1. 提示"请输入正确的手机号" |
| 优先级 |
P1 |
| 用例编号 |
TC-APP-015 |
| 用例名称 |
应用编码自动生成 |
| 前置条件 |
1. 数据库最大编码为YY000005 |
| 测试步骤 |
1. 新增一个应用 |
| 预期结果 |
1. 新应用编码为YY000006 |
| 优先级 |
P0 |
| 用例编号 |
TC-APP-016 |
| 用例名称 |
取消新增 |
| 前置条件 |
1. 已打开新增弹窗 2. 已填写部分信息 |
| 测试步骤 |
1. 点击"取消"按钮 |
| 预期结果 |
1. 弹窗关闭 2. 不保存数据 |
| 优先级 |
P1 |
2.3 编辑应用
| 用例编号 |
TC-APP-020 |
| 用例名称 |
编辑应用成功 |
| 前置条件 |
1. 数据库有应用数据 |
| 测试步骤 |
1. 点击某应用的"编辑"按钮 2. 修改应用名称 3. 修改接口授权 4. 点击"确定" |
| 预期结果 |
1. 提示"修改成功" 2. 列表刷新显示修改后的数据 |
| 优先级 |
P0 |
| 用例编号 |
TC-APP-021 |
| 用例名称 |
编辑数据回显 |
| 前置条件 |
1. 数据库有完整信息的应用 |
| 测试步骤 |
1. 点击某应用的"编辑"按钮 |
| 预期结果 |
1. 弹窗显示 2. 所有字段正确回显 3. 应用编码只读 4. 接口授权正确勾选 |
| 优先级 |
P0 |
| 用例编号 |
TC-APP-022 |
| 用例名称 |
编辑时应用编码不可修改 |
| 前置条件 |
1. 已打开编辑弹窗 |
| 测试步骤 |
1. 尝试修改应用编码 |
| 预期结果 |
1. 应用编码输入框为禁用状态 2. 无法输入 |
| 优先级 |
P0 |
| 用例编号 |
TC-APP-023 |
| 用例名称 |
编辑时修改接口授权 |
| 前置条件 |
1. 应用已授权"学校接口"和"年级接口" |
| 测试步骤 |
1. 打开编辑弹窗 2. 取消"年级接口"勾选 3. 勾选"学生接口" 4. 点击"确定" |
| 预期结果 |
1. 修改成功 2. 应用只有"学校接口"和"学生接口"权限 |
| 优先级 |
P0 |
2.4 删除应用
| 用例编号 |
TC-APP-030 |
| 用例名称 |
删除应用成功 |
| 前置条件 |
1. 数据库有应用数据 |
| 测试步骤 |
1. 点击某应用的"删除"按钮 2. 在确认弹窗点击"确定" |
| 预期结果 |
1. 提示"删除成功" 2. 列表刷新,该应用不再显示 |
| 优先级 |
P0 |
| 用例编号 |
TC-APP-031 |
| 用例名称 |
删除确认取消 |
| 前置条件 |
1. 数据库有应用数据 |
| 测试步骤 |
1. 点击某应用的"删除"按钮 2. 在确认弹窗点击"取消" |
| 预期结果 |
1. 弹窗关闭 2. 应用数据保留 |
| 优先级 |
P1 |
| 用例编号 |
TC-APP-032 |
| 用例名称 |
删除为软删除 |
| 前置条件 |
1. 数据库有应用数据 |
| 测试步骤 |
1. 删除某应用 2. 查询数据库pg_application表 |
| 预期结果 |
1. 数据库记录仍存在 2. del_flag字段值为"1" |
| 优先级 |
P1 |
2.5 重置密钥
| 用例编号 |
TC-APP-040 |
| 用例名称 |
重置密钥成功 |
| 前置条件 |
1. 数据库有应用数据 |
| 测试步骤 |
1. 点击某应用的"重置密钥"按钮 2. 在确认弹窗点击"确定" |
| 预期结果 |
1. 提示"密钥重置成功" 2. 弹出密钥展示弹窗 3. 显示新密钥(32位) |
| 优先级 |
P0 |
| 用例编号 |
TC-APP-041 |
| 用例名称 |
重置密钥确认取消 |
| 前置条件 |
1. 数据库有应用数据 |
| 测试步骤 |
1. 点击某应用的"重置密钥"按钮 2. 在确认弹窗点击"取消" |
| 预期结果 |
1. 弹窗关闭 2. 密钥未变更 |
| 优先级 |
P1 |
| 用例编号 |
TC-APP-042 |
| 用例名称 |
复制密钥功能 |
| 前置条件 |
1. 已重置密钥 2. 密钥展示弹窗已打开 |
| 测试步骤 |
1. 点击"复制"按钮 |
| 预期结果 |
1. 提示"复制成功" 2. 剪贴板包含密钥内容 |
| 优先级 |
P0 |
| 用例编号 |
TC-APP-043 |
| 用例名称 |
旧密钥失效验证 |
| 前置条件 |
1. 记录应用旧密钥 2. 已重置密钥 |
| 测试步骤 |
1. 使用旧密钥调用开放API |
| 预期结果 |
1. 返回"签名验证失败" |
| 优先级 |
P0 |
2.6 接口授权
| 用例编号 |
TC-APP-050 |
| 用例名称 |
接口授权列表显示 |
| 前置条件 |
1. 已打开新增/编辑弹窗 |
| 测试步骤 |
1. 查看接口授权区域 |
| 预期结果 |
1. 显示所有可授权的接口 2. 每个接口有复选框 |
| 优先级 |
P0 |
| 用例编号 |
TC-APP-051 |
| 用例名称 |
授权接口可调用 |
| 前置条件 |
1. 应用已授权"学校接口" |
| 测试步骤 |
1. 使用该应用密钥调用/open/school/list接口 |
| 预期结果 |
1. 接口调用成功 2. 返回学校数据 |
| 优先级 |
P0 |
| 用例编号 |
TC-APP-052 |
| 用例名称 |
未授权接口不可调用 |
| 前置条件 |
1. 应用未授权"学生接口" |
| 测试步骤 |
1. 使用该应用密钥调用/open/student/list接口 |
| 预期结果 |
1. 返回"无权访问该接口" |
| 优先级 |
P0 |
3. 接口测试用例
3.1 管理端接口
| 用例编号 |
TC-API-001 |
| 用例名称 |
获取应用列表接口 |
| 接口地址 |
GET /api/application/list |
| 请求参数 |
pageNum=1&pageSize=10 |
| 预期响应 |
code=200, rows数组, total>=0 |
| 优先级 |
P0 |
| 用例编号 |
TC-API-002 |
| 用例名称 |
获取应用详情接口 |
| 接口地址 |
GET /api/application/{appId} |
| 请求参数 |
appId=1 |
| 预期响应 |
code=200, data包含应用完整信息 |
| 优先级 |
P0 |
| 用例编号 |
TC-API-003 |
| 用例名称 |
新增应用接口 |
| 接口地址 |
POST /api/application |
| 请求参数 |
{"appName":"测试应用","status":"0","apiCodes":["SCHOOL_LIST"]} |
| 预期响应 |
code=200, data包含appCode和appSecret |
| 优先级 |
P0 |
| 用例编号 |
TC-API-004 |
| 用例名称 |
修改应用接口 |
| 接口地址 |
PUT /api/application |
| 请求参数 |
{"appId":1,"appName":"修改后名称","apiCodes":["SCHOOL_LIST","GRADE_LIST"]} |
| 预期响应 |
code=200 |
| 优先级 |
P0 |
| 用例编号 |
TC-API-005 |
| 用例名称 |
删除应用接口 |
| 接口地址 |
DELETE /api/application/{appId} |
| 请求参数 |
appId=1 |
| 预期响应 |
code=200 |
| 优先级 |
P0 |
| 用例编号 |
TC-API-006 |
| 用例名称 |
重置密钥接口 |
| 接口地址 |
PUT /api/application/resetSecret/{appId} |
| 请求参数 |
appId=1 |
| 预期响应 |
code=200, data包含appSecret |
| 优先级 |
P0 |
| 用例编号 |
TC-API-007 |
| 用例名称 |
未登录访问管理接口 |
| 接口地址 |
GET /api/application/list |
| 请求头 |
无Authorization |
| 预期响应 |
code=401 |
| 优先级 |
P0 |
3.2 开放API接口
| 用例编号 |
TC-OPEN-001 |
| 用例名称 |
签名验证成功 |
| 接口地址 |
GET /open/school/list |
| 请求头 |
X-App-Id, X-Timestamp, X-Sign(正确签名) |
| 预期响应 |
code=200, 返回数据 |
| 优先级 |
P0 |
| 用例编号 |
TC-OPEN-002 |
| 用例名称 |
缺少X-App-Id |
| 接口地址 |
GET /open/school/list |
| 请求头 |
无X-App-Id |
| 预期响应 |
code=500, msg="缺少认证参数" |
| 优先级 |
P0 |
| 用例编号 |
TC-OPEN-003 |
| 用例名称 |
缺少X-Timestamp |
| 接口地址 |
GET /open/school/list |
| 请求头 |
无X-Timestamp |
| 预期响应 |
code=500, msg="缺少认证参数" |
| 优先级 |
P0 |
| 用例编号 |
TC-OPEN-004 |
| 用例名称 |
缺少X-Sign |
| 接口地址 |
GET /open/school/list |
| 请求头 |
无X-Sign |
| 预期响应 |
code=500, msg="缺少认证参数" |
| 优先级 |
P0 |
| 用例编号 |
TC-OPEN-005 |
| 用例名称 |
签名错误 |
| 接口地址 |
GET /open/school/list |
| 请求头 |
X-Sign=错误的签名 |
| 预期响应 |
code=500, msg="签名验证失败" |
| 优先级 |
P0 |
| 用例编号 |
TC-OPEN-006 |
| 用例名称 |
时间戳过期 |
| 接口地址 |
GET /open/school/list |
| 请求头 |
X-Timestamp=10分钟前的时间戳 |
| 预期响应 |
code=500, msg="请求已过期" |
| 优先级 |
P0 |
| 用例编号 |
TC-OPEN-007 |
| 用例名称 |
应用不存在 |
| 接口地址 |
GET /open/school/list |
| 请求头 |
X-App-Id=不存在的编码 |
| 预期响应 |
code=500, msg="应用不存在" |
| 优先级 |
P0 |
| 用例编号 |
TC-OPEN-008 |
| 用例名称 |
应用已停用 |
| 前置条件 |
应用状态为停用 |
| 接口地址 |
GET /open/school/list |
| 预期响应 |
code=500, msg="应用已停用" |
| 优先级 |
P0 |
| 用例编号 |
TC-OPEN-009 |
| 用例名称 |
无接口权限 |
| 前置条件 |
应用未授权学生接口 |
| 接口地址 |
GET /open/student/list |
| 预期响应 |
code=500, msg="无权访问该接口" |
| 优先级 |
P0 |
4. 边界测试用例
4.1 输入边界
| 用例编号 |
TC-BOUND-001 |
| 用例名称 |
应用名称最大长度 |
| 测试数据 |
100个字符的应用名称 |
| 预期结果 |
保存成功 |
| 优先级 |
P1 |
| 用例编号 |
TC-BOUND-002 |
| 用例名称 |
应用名称超过最大长度 |
| 测试数据 |
101个字符的应用名称 |
| 预期结果 |
提示长度超限 |
| 优先级 |
P1 |
| 用例编号 |
TC-BOUND-003 |
| 用例名称 |
应用描述最大长度 |
| 测试数据 |
500个字符的描述 |
| 预期结果 |
保存成功 |
| 优先级 |
P1 |
| 用例编号 |
TC-BOUND-004 |
| 用例名称 |
特殊字符处理 |
| 测试数据 |
应用名称包含 |
| 预期结果 |
保存成功,内容被转义 |
| 优先级 |
P1 |
| 用例编号 |
TC-BOUND-005 |
| 用例名称 |
空格处理 |
| 测试数据 |
应用名称" 测试应用 "(前后有空格) |
| 预期结果 |
空格被trim处理 |
| 优先级 |
P2 |
4.2 业务边界
| 用例编号 |
TC-BOUND-010 |
| 用例名称 |
无授权接口的应用 |
| 测试数据 |
不勾选任何接口授权 |
| 预期结果 |
保存成功,应用无法调用任何开放API |
| 优先级 |
P1 |
| 用例编号 |
TC-BOUND-011 |
| 用例名称 |
全部授权的应用 |
| 测试数据 |
勾选所有接口授权 |
| 预期结果 |
保存成功,应用可调用所有开放API |
| 优先级 |
P1 |
| 用例编号 |
TC-BOUND-012 |
| 用例名称 |
空列表显示 |
| 前置条件 |
数据库无应用数据 |
| 预期结果 |
表格显示空状态,分页显示0条 |
| 优先级 |
P2 |
5. 性能测试用例
| 用例编号 |
TC-PERF-001 |
| 用例名称 |
列表查询响应时间 |
| 测试场景 |
数据库有1000条应用记录 |
| 性能指标 |
响应时间 ≤ 500ms |
| 优先级 |
P1 |
| 用例编号 |
TC-PERF-002 |
| 用例名称 |
签名验证响应时间 |
| 测试场景 |
连续100次开放API调用 |
| 性能指标 |
单次验证 ≤ 50ms |
| 优先级 |
P1 |
| 用例编号 |
TC-PERF-003 |
| 用例名称 |
并发访问 |
| 测试场景 |
50个并发请求应用列表 |
| 性能指标 |
无错误,响应时间 ≤ 1s |
| 优先级 |
P2 |
6. 权限测试用例
| 用例编号 |
TC-PERM-001 |
| 用例名称 |
超级管理员访问 |
| 前置条件 |
使用超级管理员账号登录 |
| 测试步骤 |
访问应用管理页面 |
| 预期结果 |
正常访问,可执行所有操作 |
| 优先级 |
P0 |
| 用例编号 |
TC-PERM-002 |
| 用例名称 |
分公司用户访问 |
| 前置条件 |
使用分公司用户账号登录 |
| 测试步骤 |
访问应用管理页面 |
| 预期结果 |
无权限访问,显示无权限提示或菜单不可见 |
| 优先级 |
P0 |
| 用例编号 |
TC-PERM-003 |
| 用例名称 |
学校用户访问 |
| 前置条件 |
使用学校用户账号登录 |
| 测试步骤 |
访问应用管理页面 |
| 预期结果 |
无权限访问 |
| 优先级 |
P0 |
7. 测试数据
7.1 基础测试数据
-- 测试应用数据
INSERT INTO pg_application (app_id, app_code, app_name, app_secret, status, create_time) VALUES
(1, 'YY000001', 'AI智慧平台', 'a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6', '0', NOW()),
(2, 'YY000002', '在线课堂系统', 'b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7', '0', NOW()),
(3, 'YY000003', '停用测试应用', 'c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8', '1', NOW());
-- 测试接口授权数据
INSERT INTO pg_app_api (app_id, api_code, api_name, api_path) VALUES
(1, 'SCHOOL_LIST', '查询学校信息', '/open/school/list'),
(1, 'GRADE_LIST', '查询年级信息', '/open/grade/list'),
(1, 'CLASS_LIST', '查询班级信息', '/open/class/list'),
(2, 'STUDENT_LIST', '查询学生信息', '/open/student/list'),
(2, 'MEMBER_LIST', '查询会员信息', '/open/member/list');
7.2 签名测试数据
应用编码:YY000001
应用密钥:a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
时间戳:1706716800000 (2026-01-31 12:00:00)
请求参数:pageNum=1&pageSize=10
签名字符串:pageNum=1&pageSize=10&appSecret=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
MD5签名:E5D7C6B5A4F3E2D1C0B9A8F7E6D5C4B3(示例)
8. 测试环境要求
| 项目 |
要求 |
| 浏览器 |
Chrome 最新版 |
| 后端服务 |
已部署并正常运行 |
| 数据库 |
MySQL 8.0,已初始化测试数据 |
| Redis |
已启动 |
| 测试账号 |
超级管理员、分公司用户、学校用户各一个 |
9. 缺陷等级定义
| 等级 |
定义 |
处理要求 |
| 致命 |
系统崩溃、数据丢失、核心功能无法使用 |
立即修复 |
| 严重 |
主要功能异常、数据错误 |
当天修复 |
| 一般 |
次要功能异常、UI问题 |
3天内修复 |
| 建议 |
优化建议、体验问题 |
下版本修复 |
文档结束