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

15 KiB

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标准

测试数据:

{
  "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已生成
  • 密码已加密

测试数据:

{
  "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
  • 返回创建的角色信息

测试数据:

{
  "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
  • 返回创建的字典信息

测试数据:

{
  "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已加密

测试数据:

{
  "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. 测试覆盖率

缺陷分类

  • 严重: 系统崩溃、数据丢失
  • 高: 核心功能不可用
  • 中: 功能部分不可用
  • 低: 界面、文案问题