# 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. 测试覆盖率 ## 缺陷分类 - 严重: 系统崩溃、数据丢失 - 高: 核心功能不可用 - 中: 功能部分不可用 - 低: 界面、文案问题