You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
3.8 KiB

#!/usr/bin/env python3
"""
测试全局异常处理功能
"""
import asyncio
import requests
from app.core.app.factory import create_development_app
from app.core.exceptions import (
AdbConnectionError, AdbProtocolError, AdbDeviceNotFoundError
)
from app.core.exceptions import (
BusinessError, ValidationError, ResourceNotFoundError, PermissionError
)
# 创建测试应用
app = create_development_app()
# 测试客户端
client = requests.Session()
base_url = "http://localhost:8000"
def test_adb_exceptions():
"""测试ADB异常处理"""
print("=== 测试ADB异常处理 ===")
# 模拟ADB连接错误
try:
raise AdbConnectionError("无法连接到ADB服务器")
except AdbConnectionError as e:
print(f"ADB连接错误: {e}")
# 模拟ADB协议错误
try:
raise AdbProtocolError("ADB协议错误")
except AdbProtocolError as e:
print(f"ADB协议错误: {e}")
# 模拟设备未找到错误
try:
raise AdbDeviceNotFoundError("设备 device_123 未找到")
except AdbDeviceNotFoundError as e:
print(f"设备未找到错误: {e}")
def test_business_exceptions():
"""测试业务异常处理"""
print("\n=== 测试业务异常处理 ===")
# 模拟数据验证错误
try:
raise ValidationError("设备序列号不能为空", field="device_serial")
except ValidationError as e:
print(f"数据验证错误: {e.message}, 字段: {e.field}")
# 模拟资源未找到错误
try:
raise ResourceNotFoundError("应用 com.example.app 未找到", resource_type="application")
except ResourceNotFoundError as e:
print(f"资源未找到错误: {e.message}, 资源类型: {e.resource_type}")
# 模拟权限错误
try:
raise PermissionError("没有权限执行此操作")
except PermissionError as e:
print(f"权限错误: {e.message}")
def test_error_response_format():
"""测试错误响应格式"""
print("\n=== 测试错误响应格式 ===")
from app.core.handlers.exception_handlers import ErrorResponse
# 创建标准错误响应
error_response = ErrorResponse(
success=False,
error_code="TEST_ERROR",
message="这是一个测试错误",
details={"test_field": "test_value"},
request_id="req-123"
)
print("标准错误响应格式:")
print(error_response.to_dict())
def test_api_endpoints():
"""测试API端点的异常处理"""
print("\n=== 测试API端点异常处理 ===")
# 注意:这需要在应用运行时执行
print("要测试API端点异常处理,请先启动应用:")
print("python run.py --env development")
print("\n然后可以测试以下端点:")
print("- GET /api/v1/adb/server/info")
print("- GET /api/v1/adb/devices")
print("- POST /api/v1/adb/devices/{device_serial}/shell")
def test_middleware():
"""测试中间件功能"""
print("\n=== 测试中间件功能 ===")
from app.core.middleware import RequestMiddleware
from fastapi import Request, Response
from starlette.types import ASGIApp
print("中间件功能包括:")
print("- 自动生成请求ID")
print("- 记录请求开始和完成时间")
print("- 添加响应头 (X-Request-ID, X-Process-Time)")
print("- 记录详细的请求日志")
def main():
"""主函数"""
print("全局异常处理测试")
print("=" * 50)
# 测试各种异常类型
test_adb_exceptions()
test_business_exceptions()
test_error_response_format()
test_api_endpoints()
test_middleware()
print("\n" + "=" * 50)
print("测试完成!")
print("\n要启动应用并测试实际API,请运行:")
print("python run.py --env development")
if __name__ == "__main__":
main()