15 KiB
E2E测试用例设计文档
项目概述
本项目是一个基于Spring Boot 3.5.9 + WebFlux的响应式管理系统API,采用PostgreSQL数据库,支持用户、角色、字典等核心业务功能。
测试目标
- 验证关键用户场景的端到端流程
- 确保API接口的正确性和稳定性
- 验证认证授权机制
- 测试数据一致性和完整性
- 验证错误处理和边界条件
测试环境
- 测试框架: Python + Playwright
- API基础URL: http://localhost:8080
- 测试数据库: PostgreSQL (Test环境)
- 测试数据: 自动化准备和清理
测试用例设计
1. 认证授权测试
1.1 用户登录流程
用例ID: TC-AUTH-001
优先级: P0
前置条件: 系统已启动,数据库中存在测试用户
测试步骤:
- 发送POST请求到
/api/auth/login - 提供正确的用户名和密码
- 验证返回的access_token和refresh_token
- 验证token格式正确性
预期结果:
- HTTP状态码: 200
- 返回包含accessToken和refreshToken
- token格式符合JWT标准
测试数据:
{
"username": "admin",
"password": "admin123"
}
1.2 Token刷新流程
用例ID: TC-AUTH-002
优先级: P0
前置条件: 已获得有效的refresh_token
测试步骤:
- 发送POST请求到
/api/auth/refresh - 提供有效的refresh_token
- 验证返回新的access_token
预期结果:
- HTTP状态码: 200
- 返回新的accessToken
- refreshToken保持不变或更新
1.3 用户登出流程
用例ID: TC-AUTH-003
优先级: P1
前置条件: 已登录,持有有效token
测试步骤:
- 发送POST请求到
/api/auth/logout - 在Header中携带Authorization: Bearer {token}
- 验证登出成功
预期结果:
- HTTP状态码: 200
- 返回成功消息
- token被加入黑名单
1.4 无效登录测试
用例ID: TC-AUTH-004
优先级: P1
测试步骤:
- 使用错误的用户名或密码登录
- 验证错误响应
预期结果:
- HTTP状态码: 401
- 返回认证失败消息
2. 用户管理测试
2.1 创建用户
用例ID: TC-USER-001
优先级: P0
前置条件: 已登录,具有ADMIN权限
测试步骤:
- 发送POST请求到
/api/users - 提供用户信息
- 验证用户创建成功
预期结果:
- HTTP状态码: 201
- 返回创建的用户信息
- 用户ID已生成
- 密码已加密
测试数据:
{
"username": "testuser",
"password": "password123",
"email": "test@example.com",
"roleId": 2,
"status": 1
}
2.2 查询单个用户
用例ID: TC-USER-002
优先级: P0
测试步骤:
- 发送GET请求到
/api/users/{id} - 验证返回正确的用户信息
预期结果:
- HTTP状态码: 200
- 返回完整的用户信息
2.3 查询所有用户
用例ID: TC-USER-003
优先级: P0
测试步骤:
- 发送GET请求到
/api/users - 验证返回用户列表
预期结果:
- HTTP状态码: 200
- 返回用户数组
- 包含分页信息(如已实现)
2.4 更新用户
用例ID: TC-USER-004
优先级: P0
测试步骤:
- 发送PUT请求到
/api/users/{id} - 提供更新的用户信息
- 验证更新成功
预期结果:
- HTTP状态码: 200
- 返回更新后的用户信息
2.5 删除用户
用例ID: TC-USER-005
优先级: P0
测试步骤:
- 发送DELETE请求到
/api/users/{id} - 验证删除成功
预期结果:
- HTTP状态码: 204
- 用户已被物理删除
2.6 逻辑删除用户
用例ID: TC-USER-006
优先级: P1
测试步骤:
- 发送DELETE请求到
/api/users/{id}/logical - 验证逻辑删除成功
- 查询已删除用户(带includeDeleted=true)
预期结果:
- HTTP状态码: 200
- 用户被标记为已删除
- 可以通过includeDeleted参数查询到
2.7 恢复已删除用户
用例ID: TC-USER-007
优先级: P1
前置条件: 用户已被逻辑删除
测试步骤:
- 发送POST请求到
/api/users/{id}/restore - 验证恢复成功
预期结果:
- HTTP状态码: 200
- 用户状态恢复正常
2.8 用户名唯一性检查
用例ID: TC-USER-008
优先级: P1
测试步骤:
- 发送GET请求到
/api/users/check/username?username=existing - 验证返回true
- 使用不存在的用户名验证返回false
预期结果:
- HTTP状态码: 200
- 返回正确的布尔值
2.9 邮箱唯一性检查
用例ID: TC-USER-009
优先级: P1
测试步骤:
- 发送GET请求到
/api/users/check/email?email=existing@example.com - 验证返回true
- 使用不存在的邮箱验证返回false
预期结果:
- HTTP状态码: 200
- 返回正确的布尔值
3. 角色管理测试
3.1 创建角色
用例ID: TC-ROLE-001
优先级: P0
前置条件: 已登录,具有ADMIN权限
测试步骤:
- 发送POST请求到
/api/roles - 提供角色信息
- 验证角色创建成功
预期结果:
- HTTP状态码: 201
- 返回创建的角色信息
测试数据:
{
"name": "TEST_ROLE",
"description": "测试角色",
"permissions": "READ,WRITE"
}
3.2 查询角色
用例ID: TC-ROLE-002
优先级: P0
测试步骤:
- 发送GET请求到
/api/roles/{id} - 验证返回正确的角色信息
预期结果:
- HTTP状态码: 200
- 返回完整的角色信息
3.3 按名称查询角色
用例ID: TC-ROLE-003
优先级: P1
测试步骤:
- 发送GET请求到
/api/roles/name/{name} - 验证返回正确的角色信息
预期结果:
- HTTP状态码: 200
- 返回指定名称的角色
3.4 查询所有角色
用例ID: TC-ROLE-004
优先级: P0
测试步骤:
- 发送GET请求到
/api/roles - 验证返回角色列表
预期结果:
- HTTP状态码: 200
- 返回角色数组
3.5 更新角色
用例ID: TC-ROLE-005
优先级: P0
测试步骤:
- 发送PUT请求到
/api/roles/{id} - 提供更新的角色信息
- 验证更新成功
预期结果:
- HTTP状态码: 200
- 返回更新后的角色信息
3.6 删除角色
用例ID: TC-ROLE-006
优先级: P0
测试步骤:
- 发送DELETE请求到
/api/roles/{id} - 验证删除成功
预期结果:
- HTTP状态码: 204
3.7 逻辑删除角色
用例ID: TC-ROLE-007
优先级: P1
测试步骤:
- 发送DELETE请求到
/api/roles/{id}/logical - 验证逻辑删除成功
预期结果:
- HTTP状态码: 200
- 角色被标记为已删除
3.8 恢复已删除角色
用例ID: TC-ROLE-008
优先级: P1
测试步骤:
- 发送POST请求到
/api/roles/{id}/restore - 验证恢复成功
预期结果:
- HTTP状态码: 200
- 角色状态恢复正常
3.9 角色名唯一性检查
用例ID: TC-ROLE-009
优先级: P1
测试步骤:
- 发送GET请求到
/api/roles/check/name?name=existing - 验证返回true
- 使用不存在的角色名验证返回false
预期结果:
- HTTP状态码: 200
- 返回正确的布尔值
4. 字典管理测试
4.1 创建字典
用例ID: TC-DICT-001
优先级: P0
前置条件: 已登录,具有ADMIN权限
测试步骤:
- 发送POST请求到
/api/dictionaries - 提供字典信息
- 验证字典创建成功
预期结果:
- HTTP状态码: 201
- 返回创建的字典信息
测试数据:
{
"type": "USER_STATUS",
"code": "ACTIVE",
"name": "激活",
"value": "1",
"remark": "用户激活状态",
"sort": 1
}
4.2 查询字典
用例ID: TC-DICT-002
优先级: P0
测试步骤:
- 发送GET请求到
/api/dictionaries/{id} - 验证返回正确的字典信息
预期结果:
- HTTP状态码: 200
- 返回完整的字典信息
4.3 按类型查询字典
用例ID: TC-DICT-003
优先级: P0
测试步骤:
- 发送GET请求到
/api/dictionaries/type/{type} - 验证返回指定类型的字典列表
预期结果:
- HTTP状态码: 200
- 返回指定类型的字典数组
- 按sort字段排序
4.4 查询所有字典
用例ID: TC-DICT-004
优先级: P0
测试步骤:
- 发送GET请求到
/api/dictionaries - 验证返回字典列表
预期结果:
- HTTP状态码: 200
- 返回字典数组
4.5 更新字典
用例ID: TC-DICT-005
优先级: P0
测试步骤:
- 发送PUT请求到
/api/dictionaries/{id} - 提供更新的字典信息
- 验证更新成功
预期结果:
- HTTP状态码: 200
- 返回更新后的字典信息
4.6 删除字典
用例ID: TC-DICT-006
优先级: P0
测试步骤:
- 发送DELETE请求到
/api/dictionaries/{id} - 验证删除成功
预期结果:
- HTTP状态码: 204
4.7 字典类型和编码唯一性检查
用例ID: TC-DICT-007
优先级: P1
测试步骤:
- 发送GET请求到
/api/dictionaries/check/exists?type=TYPE&code=CODE - 验证返回true或false
预期结果:
- HTTP状态码: 200
- 返回正确的布尔值
5. OAuth2客户端管理测试
5.1 创建OAuth2客户端
用例ID: TC-OAUTH2-001
优先级: P1
前置条件: 已登录,具有ADMIN权限
测试步骤:
- 发送POST请求到
/api/oauth2/clients - 提供客户端信息
- 验证客户端创建成功
预期结果:
- HTTP状态码: 201
- 返回创建的客户端信息
- clientSecret已加密
测试数据:
{
"clientId": "test-client",
"clientSecret": "secret123",
"clientName": "Test Client",
"webServerRedirectUri": "http://localhost:8080/callback",
"scope": "read,write",
"authorizedGrantTypes": "authorization_code,refresh_token",
"accessTokenValiditySeconds": 7200,
"refreshTokenValiditySeconds": 2592000,
"autoApprove": false,
"enabled": true
}
5.2 查询OAuth2客户端
用例ID: TC-OAUTH2-002
优先级: P1
测试步骤:
- 发送GET请求到
/api/oauth2/clients/{id} - 验证返回正确的客户端信息
预期结果:
- HTTP状态码: 200
- 返回完整的客户端信息
5.3 按clientId查询OAuth2凭证
用例ID: TC-OAUTH2-003
优先级: P1
测试步骤:
- 发送GET请求到
/api/oauth2/clients/client-id/{clientId} - 验证返回正确的客户端信息
预期结果:
- HTTP状态码: 200
- 返回指定clientId的客户端
5.4 查询所有OAuth2客户端
用例ID: TC-OAUTH2-004
优先级: P1
测试步骤:
- 发送GET请求到
/api/oauth2/clients - 验证返回客户端列表
预期结果:
- HTTP状态码: 200
- 返回客户端数组
5.5 更新OAuth2客户端
用例ID: TC-OAUTH2-005
优先级: P1
测试步骤:
- 发送PUT请求到
/api/oauth2/clients/{id} - 提供更新的客户端信息
- 验证更新成功
预期结果:
- HTTP状态码: 200
- 返回更新后的客户端信息
5.6 删除OAuth2客户端
用例ID: TC-OAUTH2-006
优先级: P1
测试步骤:
- 发送DELETE请求到
/api/oauth2/clients/{id} - 验证删除成功
预期结果:
- HTTP状态码: 204
6. 权限验证测试
6.1 无token访问受保护资源
用例ID: TC-PERM-001
优先级: P0
测试步骤:
- 不携带token访问需要认证的API
- 验证返回401
预期结果:
- HTTP状态码: 401
- 返回认证失败消息
6.2 使用过期token访问
用例ID: TC-PERM-002
优先级: P1
测试步骤:
- 使用已过期的token访问API
- 验证返回401
预期结果:
- HTTP状态码: 401
- 返回token无效消息
6.3 使用已登出的token访问
用例ID: TC-PERM-003
优先级: P1
前置条件: token已被登出
测试步骤:
- 使用已加入黑名单的token访问API
- 验证返回401
预期结果:
- HTTP状态码: 401
- 返回token无效消息
6.4 无权限访问资源
用例ID: TC-PERM-004
优先级: P1
前置条件: 用户没有访问资源的权限
测试步骤:
- 使用普通用户token访问需要ADMIN权限的资源
- 验证返回403
预期结果:
- HTTP状态码: 403
- 返回权限不足消息
7. 边界条件和异常测试
7.1 创建重复用户名
用例ID: TC-EDGE-001
优先级: P1
测试步骤:
- 创建用户A
- 使用相同的用户名创建用户B
- 验证返回错误
预期结果:
- HTTP状态码: 400或409
- 返回用户名已存在错误
7.2 创建重复邮箱
用例ID: TC-EDGE-002
优先级: P1
测试步骤:
- 创建用户A
- 使用相同的邮箱创建用户B
- 验证返回错误
预期结果:
- HTTP状态码: 400或409
- 返回邮箱已存在错误
7.3 查询不存在的资源
用例ID: TC-EDGE-003
优先级: P1
测试步骤:
- 查询不存在的用户ID
- 验证返回404
预期结果:
- HTTP状态码: 404
- 返回资源未找到消息
7.4 无效的请求参数
用例ID: TC-EDGE-004
优先级: P1
测试步骤:
- 发送缺少必填字段的请求
- 验证返回400
预期结果:
- HTTP状态码: 400
- 返回参数验证错误
7.5 超长字段输入
用例ID: TC-EDGE-005
优先级: P2
测试步骤:
- 发送超长用户名或邮箱
- 验证返回400
预期结果:
- HTTP状态码: 400
- 返回字段长度超限错误
8. 性能测试
8.1 并发登录测试
用例ID: TC-PERF-001
优先级: P2
测试步骤:
- 模拟100个并发登录请求
- 验证所有请求都能正常响应
- 记录响应时间
预期结果:
- 所有请求成功
- 平均响应时间 < 500ms
- 无错误发生
8.2 批量查询性能测试
用例ID: TC-PERF-002
优先级: P2
测试步骤:
- 创建1000个测试用户
- 查询所有用户
- 记录响应时间
预期结果:
- HTTP状态码: 200
- 响应时间 < 1000ms
- 返回完整数据
9. 数据一致性测试
9.1 缓存一致性测试
用例ID: TC-CONSIST-001
优先级: P1
测试步骤:
- 查询用户A(首次查询,从数据库)
- 更新用户A
- 再次查询用户A(应从缓存获取)
- 验证返回更新后的数据
预期结果:
- 第二次查询返回更新后的数据
- 缓存被正确失效
9.2 审计日志测试
用例ID: TC-CONSIST-002
优先级: P1
测试步骤:
- 创建用户
- 更新用户
- 删除用户
- 查询审计日志
- 验证所有操作都被记录
预期结果:
- 所有操作都被记录
- 审计日志包含完整的变更信息
测试执行计划
测试优先级
- P0: 核心功能,必须全部通过
- P1: 重要功能,应该全部通过
- P2: 辅助功能,尽量通过
测试顺序
- 认证授权测试
- 用户管理测试
- 角色管理测试
- 字典管理测试
- OAuth2客户端管理测试
- 权限验证测试
- 边界条件和异常测试
- 性能测试
- 数据一致性测试
测试数据准备
- 自动化创建测试用户、角色、字典数据
- 测试完成后自动清理
- 使用事务回滚确保测试隔离
测试报告
测试报告应包含以下内容:
- 测试执行摘要
- 通过/失败用例统计
- 失败用例详情
- 性能指标
- 缺陷列表
- 测试覆盖率
缺陷分类
- 严重: 系统崩溃、数据丢失
- 高: 核心功能不可用
- 中: 功能部分不可用
- 低: 界面、文案问题