Files
novalon-manage-system/.trae/docs/e2e_testing/E2E_TEST_CASES.md
T

708 lines
15 KiB
Markdown

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