first commit
This commit is contained in:
270
tests/integration_test_config.py
Normal file
270
tests/integration_test_config.py
Normal file
@@ -0,0 +1,270 @@
|
||||
"""
|
||||
智能算法展示平台 - 集成测试配置
|
||||
|
||||
此配置文件定义了集成测试所需的设置和参数。
|
||||
"""
|
||||
|
||||
import os
|
||||
from typing import Dict, Any, Optional
|
||||
|
||||
|
||||
class IntegrationTestConfig:
|
||||
"""集成测试配置类"""
|
||||
|
||||
def __init__(self):
|
||||
# 基础URL配置
|
||||
self.base_url = os.getenv('TEST_BASE_URL', 'http://localhost:8000')
|
||||
self.api_version = '/api/v1'
|
||||
|
||||
# 认证配置
|
||||
self.api_key = os.getenv('TEST_API_KEY', 'test-key-12345')
|
||||
self.auth_headers = {
|
||||
'Authorization': f'Bearer {self.api_key}',
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
|
||||
# 测试数据配置
|
||||
self.test_timeout = int(os.getenv('TEST_TIMEOUT', '30'))
|
||||
self.retry_count = int(os.getenv('TEST_RETRY_COUNT', '3'))
|
||||
self.delay_between_retries = float(os.getenv('TEST_DELAY_BETWEEN_RETRIES', '1.0'))
|
||||
|
||||
# 服务配置
|
||||
self.backend_port = int(os.getenv('BACKEND_PORT', '8000'))
|
||||
self.frontend_port = int(os.getenv('FRONTEND_PORT', '3000'))
|
||||
self.db_host = os.getenv('DB_HOST', 'localhost')
|
||||
self.db_port = int(os.getenv('DB_PORT', '5432'))
|
||||
|
||||
# 测试算法配置
|
||||
self.test_algorithms = [
|
||||
{
|
||||
'name': 'Image Classification Test Algorithm',
|
||||
'description': 'Test algorithm for image classification',
|
||||
'type': 'computer_vision',
|
||||
'status': 'active',
|
||||
'input_schema': {
|
||||
'image_url': {'type': 'string', 'required': True}
|
||||
},
|
||||
'output_schema': {
|
||||
'predictions': {
|
||||
'type': 'array',
|
||||
'items': {
|
||||
'class': {'type': 'string'},
|
||||
'confidence': {'type': 'number'}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
'name': 'Text Analysis Test Algorithm',
|
||||
'description': 'Test algorithm for text analysis',
|
||||
'type': 'nlp',
|
||||
'status': 'active',
|
||||
'input_schema': {
|
||||
'text': {'type': 'string', 'required': True}
|
||||
},
|
||||
'output_schema': {
|
||||
'sentiment': {'type': 'string'},
|
||||
'entities': {'type': 'array', 'items': {'type': 'string'}}
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
# 测试输入数据
|
||||
self.test_inputs = {
|
||||
'computer_vision': {
|
||||
'image_url': 'https://example.com/test-image.jpg'
|
||||
},
|
||||
'nlp': {
|
||||
'text': 'This is a test text for NLP algorithm.'
|
||||
},
|
||||
'ml': {
|
||||
'features': [1.0, 2.0, 3.0, 4.0, 5.0]
|
||||
}
|
||||
}
|
||||
|
||||
# 测试参数
|
||||
self.test_params = {
|
||||
'confidence_threshold': 0.7,
|
||||
'max_results': 10,
|
||||
'return_probabilities': True
|
||||
}
|
||||
|
||||
def get_api_url(self, endpoint: str) -> str:
|
||||
"""获取API端点的完整URL"""
|
||||
return f"{self.base_url}{self.api_version}{endpoint}"
|
||||
|
||||
def get_auth_headers(self) -> Dict[str, str]:
|
||||
"""获取认证头部信息"""
|
||||
return self.auth_headers.copy()
|
||||
|
||||
def get_test_algorithm_by_type(self, alg_type: str) -> Optional[Dict[str, Any]]:
|
||||
"""根据类型获取测试算法配置"""
|
||||
for alg in self.test_algorithms:
|
||||
if alg['type'] == alg_type:
|
||||
return alg
|
||||
return None
|
||||
|
||||
|
||||
# 全局配置实例
|
||||
test_config = IntegrationTestConfig()
|
||||
|
||||
|
||||
def get_test_config() -> IntegrationTestConfig:
|
||||
"""获取测试配置实例"""
|
||||
return test_config
|
||||
|
||||
|
||||
# 环境特定的配置
|
||||
class TestEnvironment:
|
||||
"""测试环境配置"""
|
||||
|
||||
LOCAL = "local"
|
||||
DOCKER = "docker"
|
||||
CI_CD = "ci_cd"
|
||||
|
||||
@staticmethod
|
||||
def detect_environment() -> str:
|
||||
"""检测当前测试环境"""
|
||||
if os.getenv('CI'):
|
||||
return TestEnvironment.CI_CD
|
||||
elif os.getenv('DOCKER_ENV'):
|
||||
return TestEnvironment.DOCKER
|
||||
else:
|
||||
return TestEnvironment.LOCAL
|
||||
|
||||
@staticmethod
|
||||
def get_environment_config(env_type: str) -> Dict[str, Any]:
|
||||
"""获取特定环境的配置"""
|
||||
configs = {
|
||||
TestEnvironment.LOCAL: {
|
||||
'base_url': 'http://localhost:8000',
|
||||
'db_url': 'postgresql://user:password@localhost:5432/test_db',
|
||||
'redis_url': 'redis://localhost:6379/0',
|
||||
'minio_url': 'http://localhost:9000'
|
||||
},
|
||||
TestEnvironment.DOCKER: {
|
||||
'base_url': 'http://backend:8000',
|
||||
'db_url': 'postgresql://user:password@db:5432/test_db',
|
||||
'redis_url': 'redis://redis:6379/0',
|
||||
'minio_url': 'http://minio:9000'
|
||||
},
|
||||
TestEnvironment.CI_CD: {
|
||||
'base_url': os.getenv('TEST_BASE_URL', 'http://localhost:8000'),
|
||||
'db_url': os.getenv('TEST_DB_URL', 'postgresql://user:password@localhost:5432/test_db'),
|
||||
'redis_url': os.getenv('TEST_REDIS_URL', 'redis://localhost:6379/0'),
|
||||
'minio_url': os.getenv('TEST_MINIO_URL', 'http://localhost:9000')
|
||||
}
|
||||
}
|
||||
return configs.get(env_type, configs[TestEnvironment.LOCAL])
|
||||
|
||||
|
||||
# 数据工厂类,用于生成测试数据
|
||||
class TestDataFactory:
|
||||
"""测试数据工厂"""
|
||||
|
||||
@staticmethod
|
||||
def create_algorithm_data(name_suffix: str = "") -> Dict[str, Any]:
|
||||
"""创建算法测试数据"""
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
|
||||
return {
|
||||
'id': f'test-alg-{uuid.uuid4().hex[:8]}',
|
||||
'name': f'Test Algorithm {name_suffix}'.strip() or f'Test Algorithm {uuid.uuid4().hex[:8]}',
|
||||
'description': f'Test algorithm for integration testing {datetime.now().isoformat()}',
|
||||
'type': 'computer_vision',
|
||||
'status': 'active',
|
||||
'versions': [],
|
||||
'created_at': datetime.now().isoformat(),
|
||||
'updated_at': datetime.now().isoformat()
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
def create_call_data(algorithm_id: str, version_id: str = None) -> Dict[str, Any]:
|
||||
"""创建算法调用测试数据"""
|
||||
import uuid
|
||||
|
||||
return {
|
||||
'id': f'test-call-{uuid.uuid4().hex[:8]}',
|
||||
'user_id': f'test-user-{uuid.uuid4().hex[:8]}',
|
||||
'algorithm_id': algorithm_id,
|
||||
'version_id': version_id or f'test-ver-{uuid.uuid4().hex[:8]}',
|
||||
'input_data': {'test': 'data'},
|
||||
'params': {'test_param': 'test_value'},
|
||||
'output_data': {'result': 'test_result'},
|
||||
'status': 'success',
|
||||
'response_time': 0.123,
|
||||
'error_message': None,
|
||||
'created_at': datetime.now().isoformat(),
|
||||
'updated_at': datetime.now().isoformat()
|
||||
}
|
||||
|
||||
|
||||
# 测试助手类
|
||||
class TestHelpers:
|
||||
"""测试助手类,提供常用的测试辅助功能"""
|
||||
|
||||
@staticmethod
|
||||
def wait_for_service(url: str, timeout: int = 30, interval: float = 1.0) -> bool:
|
||||
"""等待服务启动"""
|
||||
import time
|
||||
import requests
|
||||
from requests.exceptions import RequestException
|
||||
|
||||
start_time = time.time()
|
||||
while time.time() - start_time < timeout:
|
||||
try:
|
||||
response = requests.get(url, timeout=5)
|
||||
if response.status_code == 200:
|
||||
return True
|
||||
except RequestException:
|
||||
pass
|
||||
|
||||
time.sleep(interval)
|
||||
|
||||
return False
|
||||
|
||||
@staticmethod
|
||||
def cleanup_test_data(api_url: str, headers: Dict[str, str], test_ids: list):
|
||||
"""清理测试数据"""
|
||||
import requests
|
||||
|
||||
# 这里可以添加清理测试数据的逻辑
|
||||
# 例如删除测试算法、清理测试调用记录等
|
||||
print(f"清理测试数据: {test_ids}")
|
||||
|
||||
|
||||
# 用于运行测试的装饰器
|
||||
def retry_on_failure(max_attempts: int = 3, delay: float = 1.0):
|
||||
"""失败重试装饰器"""
|
||||
def decorator(func):
|
||||
def wrapper(*args, **kwargs):
|
||||
last_exception = None
|
||||
for attempt in range(max_attempts):
|
||||
try:
|
||||
return func(*args, **kwargs)
|
||||
except Exception as e:
|
||||
last_exception = e
|
||||
if attempt < max_attempts - 1:
|
||||
import time
|
||||
time.sleep(delay)
|
||||
else:
|
||||
raise e
|
||||
raise last_exception
|
||||
return wrapper
|
||||
return decorator
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 输出当前配置信息
|
||||
config = get_test_config()
|
||||
env = TestEnvironment.detect_environment()
|
||||
|
||||
print(f"测试环境: {env}")
|
||||
print(f"基础URL: {config.base_url}")
|
||||
print(f"API密钥: {'*' * len(config.api_key) if config.api_key else '未设置'}")
|
||||
print(f"超时时间: {config.test_timeout}秒")
|
||||
print(f"重试次数: {config.retry_count}")
|
||||
|
||||
env_config = TestEnvironment.get_environment_config(env)
|
||||
print(f"环境特定配置: {env_config}")
|
||||
Reference in New Issue
Block a user