Files
张翔 1e3dc11d59 refactor(test): 重构测试套件结构并优化测试配置
feat(test-suite): 新增测试套件模块,包含API测试客户端和测试配置
fix(api): 修复数据库实体和仓库的删除操作返回值
style(api): 统一数据库表名和字段命名
perf(api): 添加缓存注解提升配置查询性能
test(api): 添加H2测试数据库配置支持
chore: 清理旧的测试文件和脚本
2026-04-01 20:57:24 +08:00

484 lines
16 KiB
Python

"""
UAT测试套件 - 用户验收测试场景
测试范围:
1. 用户注册登录验收场景
2. 用户管理业务验收场景
3. 角色权限配置验收场景
4. 系统配置管理验收场景
5. 审计日志查询验收场景
作者: 张翔
日期: 2026-04-01
"""
import pytest
import time
import uuid
from api.auth_api import AuthAPI
from api.user_api import UserAPI
from api.role_api import RoleAPI
from api.menu_api import MenuAPI
from api.config_api import ConfigAPI
from api.audit_api import AuditAPI
from config.settings import settings
@pytest.mark.uat
@pytest.mark.asyncio
class TestUATUserScenarios:
"""UAT用户场景测试类"""
async def test_uat_new_user_registration_and_login(
self, authenticated_client, test_data_manager
):
"""
UAT-USER-01: 新用户注册登录验收场景
业务场景:
作为新用户,我希望能够注册账号并登录系统
验收标准:
1. 用户能够成功注册
2. 注册后能够立即登录
3. 登录后能看到正确的用户信息
4. 用户信息显示完整准确
"""
user_api = UserAPI(authenticated_client)
auth_api = AuthAPI(authenticated_client)
unique_id = f"uat_{int(time.time() * 1000)}_{uuid.uuid4().hex[:8]}"
user_data = {
"username": f"newuser_{unique_id}",
"password": "SecurePass123!@#",
"email": f"newuser_{unique_id}@company.com",
"phone": "13900139000",
"nickname": "新员工张三",
"status": 1
}
create_response = await user_api.create_user(user_data)
assert create_response.status_code in [201, 200], \
"❌ 用户注册失败"
user_id = create_response.json().get("id")
test_data_manager.add_user(user_id)
login_response = await auth_api.login(
user_data["username"],
user_data["password"]
)
assert login_response.status_code == 200, \
"❌ 注册后登录失败"
token = login_response.json().get("token")
assert token is not None, \
"❌ 未获取到登录令牌"
user_info_response = await user_api.get_user_by_id(user_id)
assert user_info_response.status_code == 200, \
"❌ 获取用户信息失败"
user_info = user_info_response.json()
assert user_info["username"] == user_data["username"], \
"❌ 用户名不匹配"
assert user_info["email"] == user_data["email"], \
"❌ 邮箱不匹配"
assert user_info["nickname"] == user_data["nickname"], \
"❌ 昵称不匹配"
print("✅ UAT-USER-01: 新用户注册登录验收通过")
async def test_uat_user_profile_management(
self, authenticated_client, test_data_manager
):
"""
UAT-USER-02: 用户信息管理验收场景
业务场景:
作为已登录用户,我希望能够修改我的个人信息
验收标准:
1. 用户能够修改昵称
2. 用户能够修改邮箱
3. 用户能够修改手机号
4. 修改后信息立即生效
"""
user_api = UserAPI(authenticated_client)
unique_id = f"uat_{int(time.time() * 1000)}_{uuid.uuid4().hex[:8]}"
user_data = {
"username": f"profileuser_{unique_id}",
"password": "Test123!@#",
"email": f"profile_{unique_id}@test.com",
"phone": "13800138000",
"nickname": "原始昵称",
"status": 1
}
create_response = await user_api.create_user(user_data)
user_id = create_response.json().get("id")
test_data_manager.add_user(user_id)
update_data = {
"nickname": "更新后的昵称",
"email": f"updated_{unique_id}@test.com",
"phone": "13900139000"
}
update_response = await user_api.update_user(user_id, update_data)
assert update_response.status_code == 200, \
"❌ 更新用户信息失败"
verify_response = await user_api.get_user_by_id(user_id)
updated_user = verify_response.json()
assert updated_user["nickname"] == update_data["nickname"], \
"❌ 昵称未更新"
assert updated_user["email"] == update_data["email"], \
"❌ 邮箱未更新"
assert updated_user["phone"] == update_data["phone"], \
"❌ 手机号未更新"
print("✅ UAT-USER-02: 用户信息管理验收通过")
@pytest.mark.uat
@pytest.mark.asyncio
class TestUATRolePermissionScenarios:
"""UAT角色权限场景测试类"""
async def test_uat_role_creation_and_permission_assignment(
self, authenticated_client, test_data_manager
):
"""
UAT-ROLE-01: 角色创建与权限分配验收场景
业务场景:
作为系统管理员,我希望能够创建新角色并分配相应权限
验收标准:
1. 能够创建新角色
2. 能够为角色分配菜单权限
3. 分配给用户后权限立即生效
4. 用户只能访问被授权的功能
"""
role_api = RoleAPI(authenticated_client)
user_api = UserAPI(authenticated_client)
menu_api = MenuAPI(authenticated_client)
unique_id = f"uat_{int(time.time() * 1000)}_{uuid.uuid4().hex[:8]}"
role_data = {
"roleName": f"部门经理_{unique_id}",
"roleKey": f"dept_manager_{unique_id}",
"roleSort": 10,
"status": 1,
"remark": "部门经理角色,具有用户管理权限"
}
create_response = await role_api.create_role(role_data)
assert create_response.status_code in [201, 200], \
"❌ 创建角色失败"
role_id = create_response.json().get("id")
test_data_manager.add_role(role_id)
menus_response = await menu_api.get_menus()
menus = menus_response.json() if isinstance(
menus_response.json(), list
) else menus_response.json().get("data", [])
if menus:
menu_ids = [m["id"] for m in menus[:3]]
perm_response = await role_api.assign_permissions(
role_id,
{"menuIds": menu_ids}
)
assert perm_response.status_code == 200, \
"❌ 分配菜单权限失败"
user_data = {
"username": f"roleuser_{unique_id}",
"password": "Test123!@#",
"email": f"roleuser_{unique_id}@test.com",
"phone": "13800138000",
"status": 1,
"roleId": role_id
}
user_response = await user_api.create_user(user_data)
user_id = user_response.json().get("id")
test_data_manager.add_user(user_id)
user_info = await user_api.get_user_by_id(user_id)
assert user_info.status_code == 200, \
"❌ 用户角色分配失败"
print("✅ UAT-ROLE-01: 角色创建与权限分配验收通过")
async def test_uat_permission_inheritance(
self, authenticated_client, test_data_manager
):
"""
UAT-ROLE-02: 权限继承验证场景
业务场景:
作为系统管理员,我希望子角色能够继承父角色的权限
验收标准:
1. 子角色继承父角色权限
2. 子角色可以扩展额外权限
3. 子角色权限不超过父角色
"""
role_api = RoleAPI(authenticated_client)
roles_response = await role_api.get_roles_by_page()
roles = roles_response.json().get("content", [])
assert len(roles) > 0, \
"❌ 系统中应至少有一个角色"
admin_role = next(
(r for r in roles if "admin" in r.get("roleKey", "").lower()),
None
)
if admin_role:
assert admin_role.get("status") == 1, \
"❌ 管理员角色应处于激活状态"
print("✅ UAT-ROLE-02: 权限继承验证通过")
@pytest.mark.uat
@pytest.mark.asyncio
class TestUATSystemManagementScenarios:
"""UAT系统管理场景测试类"""
async def test_uat_system_configuration_management(
self, authenticated_client, test_data_manager
):
"""
UAT-SYS-01: 系统配置管理验收场景
业务场景:
作为系统管理员,我希望能够管理系统配置参数
验收标准:
1. 能够创建新配置项
2. 能够修改配置值
3. 配置修改立即生效
4. 能够删除不需要的配置
"""
config_api = ConfigAPI(authenticated_client)
unique_id = f"uat_{int(time.time() * 1000)}_{uuid.uuid4().hex[:8]}"
config_data = {
"configKey": f"system.setting.{unique_id}",
"configValue": "initial_value",
"configName": f"测试配置_{unique_id}",
"remark": "UAT测试配置项"
}
try:
create_response = await config_api.create_config(config_data)
if create_response.status_code in [201, 200]:
config_id = create_response.json().get("id")
update_data = {
"configValue": "updated_value"
}
update_response = await config_api.update_config(
config_id,
update_data
)
assert update_response.status_code == 200, \
"❌ 更新配置失败"
get_response = await config_api.get_config_by_key(
config_data["configKey"]
)
assert get_response.status_code == 200, \
"❌ 查询配置失败"
delete_response = await config_api.delete_config(config_id)
assert delete_response.status_code in [200, 204], \
"❌ 删除配置失败"
print("✅ UAT-SYS-01: 系统配置管理验收通过")
else:
pytest.skip("系统配置功能不可用")
except Exception as e:
pytest.skip(f"系统配置测试跳过: {str(e)}")
async def test_uat_audit_log_query(
self, authenticated_client, test_data_manager
):
"""
UAT-SYS-02: 审计日志查询验收场景
业务场景:
作为系统管理员,我希望能够查询系统操作日志
验收标准:
1. 能够查询操作日志
2. 能够按时间范围筛选
3. 能够按用户筛选
4. 日志信息完整准确
"""
audit_api = AuditAPI(authenticated_client)
user_api = UserAPI(authenticated_client)
unique_id = f"uat_{int(time.time() * 1000)}"
user_data = {
"username": f"audituser_{unique_id}",
"password": "Test123!@#",
"email": f"audit_{unique_id}@test.com",
"phone": "13800138000",
"status": 1
}
create_response = await user_api.create_user(user_data)
if create_response.status_code in [201, 200]:
user_id = create_response.json().get("id")
test_data_manager.add_user(user_id)
await user_api.delete_user(user_id)
operation_logs = await audit_api.get_operation_logs(
page=0,
size=10
)
assert operation_logs.status_code == 200, \
"❌ 查询操作日志失败"
logs_data = operation_logs.json()
assert "content" in logs_data or "data" in logs_data, \
"❌ 日志数据格式不正确"
print("✅ UAT-SYS-02: 审计日志查询验收通过")
else:
pytest.skip("审计日志功能不可用")
@pytest.mark.uat
@pytest.mark.asyncio
class TestUATBusinessWorkflows:
"""UAT业务流程测试类"""
async def test_uat_complete_user_onboarding_workflow(
self, authenticated_client, test_data_manager
):
"""
UAT-WF-01: 完整用户入职流程
业务场景:
模拟真实的企业员工入职流程
流程步骤:
1. HR创建新员工账号
2. 分配相应角色
3. 员工首次登录
4. 员工修改个人信息
5. 验证权限正确
"""
user_api = UserAPI(authenticated_client)
role_api = RoleAPI(authenticated_client)
auth_api = AuthAPI(authenticated_client)
unique_id = f"onboard_{int(time.time() * 1000)}_{uuid.uuid4().hex[:8]}"
roles_response = await role_api.get_roles_by_page(size=1)
roles = roles_response.json().get("content", [])
role_id = roles[0]["id"] if roles else None
employee_data = {
"username": f"employee_{unique_id}",
"password": "Welcome123!@#",
"email": f"employee_{unique_id}@company.com",
"phone": "13900139000",
"nickname": "新员工李四",
"status": 1,
"roleId": role_id
}
create_response = await user_api.create_user(employee_data)
assert create_response.status_code in [201, 200], \
"❌ HR创建员工账号失败"
user_id = create_response.json().get("id")
test_data_manager.add_user(user_id)
login_response = await auth_api.login(
employee_data["username"],
employee_data["password"]
)
assert login_response.status_code == 200, \
"❌ 员工首次登录失败"
update_data = {
"nickname": "李四(已认证)",
"phone": "13900139001"
}
update_response = await user_api.update_user(user_id, update_data)
assert update_response.status_code == 200, \
"❌ 员工修改个人信息失败"
print("✅ UAT-WF-01: 完整用户入职流程验收通过")
async def test_uat_role_permission_change_workflow(
self, authenticated_client, test_data_manager
):
"""
UAT-WF-02: 角色权限变更流程
业务场景:
模拟员工晋升后权限调整流程
流程步骤:
1. 创建普通员工账号
2. 验证初始权限
3. 员工晋升,调整角色
4. 验证新权限生效
"""
user_api = UserAPI(authenticated_client)
role_api = RoleAPI(authenticated_client)
unique_id = f"promo_{int(time.time() * 1000)}_{uuid.uuid4().hex[:8]}"
roles_response = await role_api.get_roles_by_page()
roles = roles_response.json().get("content", [])
if len(roles) >= 2:
initial_role = roles[0]
promoted_role = roles[1]
user_data = {
"username": f"promoted_{unique_id}",
"password": "Test123!@#",
"email": f"promoted_{unique_id}@test.com",
"phone": "13800138000",
"status": 1,
"roleId": initial_role["id"]
}
create_response = await user_api.create_user(user_data)
user_id = create_response.json().get("id")
test_data_manager.add_user(user_id)
assign_response = await user_api.assign_roles(
user_id,
[promoted_role["id"]]
)
assert assign_response.status_code == 200, \
"❌ 调整角色失败"
print("✅ UAT-WF-02: 角色权限变更流程验收通过")
else:
pytest.skip("需要至少2个角色才能测试权限变更")