Files
gym-manage/test-suite/tests/integration/test_distributed_transaction.py

152 lines
5.3 KiB
Python

"""
分布式事务一致性测试用例
测试跨模块业务操作的数据一致性
"""
import pytest
import asyncio
import time
from api.user_api import UserAPI
from api.role_api import RoleAPI
from api.notice_api import SysNoticeAPI
@pytest.mark.distributed
@pytest.mark.regression
@pytest.mark.critical
class TestDistributedTransaction:
"""分布式事务一致性测试类"""
@pytest.mark.asyncio
async def test_user_role_assignment_consistency(self, authenticated_client, test_data_manager):
"""测试用户角色分配的事务一致性"""
user_api = UserAPI(authenticated_client)
role_api = RoleAPI(authenticated_client)
unique_id = f"{int(time.time() * 1000)}"
# 创建角色
role_data = {
"roleName": f"TX_Role_{unique_id}",
"roleKey": f"tx_role_{unique_id}",
"roleSort": 1,
"status": 1
}
role_response = await role_api.create_role(role_data)
assert role_response.status_code == 201
role_id = role_response.json()["id"]
test_data_manager.add_role(role_id)
# 创建用户
user_data = {
"username": f"tx_user_{unique_id}",
"password": "Test123!@#",
"email": f"tx_{unique_id}@example.com",
"status": 1
}
user_response = await user_api.create_user(user_data)
assert user_response.status_code == 201
user_id = user_response.json()["id"]
test_data_manager.add_user(user_id)
# 分配角色
assign_response = await user_api.update_user(user_id, {"roleId": role_id})
assert assign_response.status_code == 200
# 验证一致性
user_verify = await user_api.get_user_by_id(user_id)
assert user_verify.json()["roleId"] == role_id
role_verify = await role_api.get_role_by_id(role_id)
assert role_verify.status_code == 200
@pytest.mark.asyncio
async def test_multi_module_operation_consistency(self, authenticated_client, test_data_manager):
"""测试多模块操作的事务一致性"""
user_api = UserAPI(authenticated_client)
role_api = RoleAPI(authenticated_client)
notice_api = SysNoticeAPI(authenticated_client)
unique_id = f"{int(time.time() * 1000)}"
# 创建角色
role_data = {
"roleName": f"Multi_Role_{unique_id}",
"roleKey": f"multi_role_{unique_id}",
"roleSort": 1,
"status": 1
}
role_response = await role_api.create_role(role_data)
role_id = role_response.json()["id"]
test_data_manager.add_role(role_id)
# 创建用户
user_data = {
"username": f"multi_user_{unique_id}",
"password": "Test123!@#",
"email": f"multi_{unique_id}@example.com",
"roleId": role_id,
"status": 1
}
user_response = await user_api.create_user(user_data)
user_id = user_response.json()["id"]
test_data_manager.add_user(user_id)
# 创建通知
notice_data = {
"noticeTitle": f"Multi_Notice_{unique_id}",
"noticeType": "1",
"noticeContent": f"用户 {user_data['username']} 已创建",
"status": "0"
}
notice_response = await notice_api.create(notice_data)
assert notice_response.status_code in [200, 201]
# 验证所有操作都成功
user_verify = await user_api.get_user_by_id(user_id)
assert user_verify.status_code == 200
role_verify = await role_api.get_role_by_id(role_id)
assert role_verify.status_code == 200
notices = await notice_api.get_all()
assert notices.status_code == 200
notice_list = notices.json()
assert any(n["noticeTitle"] == notice_data["noticeTitle"] for n in notice_list)
@pytest.mark.asyncio
async def test_transaction_rollback_on_failure(self, authenticated_client, test_data_manager):
"""测试失败时的事务回滚"""
user_api = UserAPI(authenticated_client)
role_api = RoleAPI(authenticated_client)
unique_id = f"{int(time.time() * 1000)}"
# 创建角色
role_data = {
"roleName": f"Rollback_Role_{unique_id}",
"roleKey": f"rollback_role_{unique_id}",
"roleSort": 1,
"status": 1
}
role_response = await role_api.create_role(role_data)
role_id = role_response.json()["id"]
test_data_manager.add_role(role_id)
# 尝试创建无效用户(应该失败)
invalid_user_data = {
"username": "", # 无效用户名
"password": "Test123!@#",
"email": f"rollback_{unique_id}@example.com",
"roleId": role_id,
"status": 1
}
invalid_response = await user_api.create_user(invalid_user_data)
assert invalid_response.status_code in [400, 422]
# 验证角色仍然存在(不应该被回滚)
role_verify = await role_api.get_role_by_id(role_id)
assert role_verify.status_code == 200