Files
algorithm/tests/integration_tests.py
2026-02-08 14:42:58 +08:00

526 lines
17 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
智能算法展示平台 - 系统集成测试套件
此测试套件验证整个系统的功能完整性,包括:
- API网关功能
- 算法注册和管理
- 算法调用流程
- 数据管理
- 用户认证和权限
- 监控和日志
- 服务发现和管理
"""
import os
import sys
import unittest
import asyncio
import requests
import time
from datetime import datetime, timedelta
from typing import Dict, Any, Optional
# 添加项目根目录到路径
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
from backend.app.services.service_manager import ServiceManager
from backend.app.services.data_manager import DataManager
from backend.app.services.monitoring import MonitoringService
from backend.app.services.permission import PermissionManager
class IntegrationTestBase(unittest.TestCase):
"""集成测试基类"""
@classmethod
def setUpClass(cls):
"""在所有测试开始前设置"""
cls.base_url = os.getenv('TEST_BASE_URL', 'http://localhost:8000')
cls.api_key = os.getenv('TEST_API_KEY', 'test-key-12345')
cls.headers = {
'Authorization': f'Bearer {cls.api_key}',
'Content-Type': 'application/json'
}
cls.test_algorithm_id = 'test-alg-' + str(int(time.time()))
cls.test_user_id = 'test-user-' + str(int(time.time()))
def setUp(self):
"""每个测试开始前设置"""
self.session = requests.Session()
self.session.headers.update(self.headers)
def tearDown(self):
"""每个测试结束后清理"""
self.session.close()
class TestAlgorithmManagement(IntegrationTestBase):
"""算法管理功能集成测试"""
def test_create_and_get_algorithm(self):
"""测试创建和获取算法"""
# 创建算法
algorithm_data = {
'name': f'Test Algorithm {self.test_algorithm_id}',
'description': 'Test algorithm for integration testing',
'type': 'computer_vision',
'status': 'active'
}
response = self.session.post(
f'{self.base_url}/api/v1/algorithms',
json=algorithm_data
)
self.assertEqual(response.status_code, 200)
created_alg = response.json()
self.assertEqual(created_alg['name'], algorithm_data['name'])
self.assertEqual(created_alg['type'], algorithm_data['type'])
# 获取刚创建的算法
response = self.session.get(
f'{self.base_url}/api/v1/algorithms/{created_alg["id"]}'
)
self.assertEqual(response.status_code, 200)
retrieved_alg = response.json()
self.assertEqual(retrieved_alg['id'], created_alg['id'])
self.assertEqual(retrieved_alg['name'], created_alg['name'])
def test_list_algorithms(self):
"""测试获取算法列表"""
response = self.session.get(f'{self.base_url}/api/v1/algorithms')
self.assertEqual(response.status_code, 200)
data = response.json()
self.assertIn('algorithms', data)
self.assertIn('total', data)
self.assertIsInstance(data['algorithms'], list)
class TestAlgorithmCallFlow(IntegrationTestBase):
"""算法调用流程集成测试"""
def setUp(self):
super().setUp()
# 创建一个测试算法
algorithm_data = {
'name': f'Test Call Algorithm {self.test_algorithm_id}',
'description': 'Test algorithm for call flow testing',
'type': 'computer_vision',
'status': 'active'
}
response = self.session.post(
f'{self.base_url}/api/v1/algorithms',
json=algorithm_data
)
self.assertEqual(response.status_code, 200)
self.created_algorithm = response.json()
def test_algorithm_call_process(self):
"""测试完整的算法调用流程"""
# 调用算法
call_data = {
'algorithm_id': self.created_algorithm['id'],
'version_id': self.created_algorithm['versions'][0]['id'] if self.created_algorithm['versions'] else None,
'input_data': {
'image_url': 'https://example.com/test-image.jpg'
},
'params': {
'confidence_threshold': 0.7
}
}
response = self.session.post(
f'{self.base_url}/api/v1/algorithms/call',
json=call_data
)
self.assertEqual(response.status_code, 200)
call_result = response.json()
self.assertIn('id', call_result)
self.assertIn('status', call_result)
self.assertIn('output_data', call_result)
# 获取调用结果
response = self.session.get(
f'{self.base_url}/api/v1/algorithms/calls/{call_result["id"]}'
)
self.assertEqual(response.status_code, 200)
retrieved_result = response.json()
self.assertEqual(retrieved_result['id'], call_result['id'])
self.assertEqual(retrieved_result['status'], call_result['status'])
class TestGatewayFunctionality(IntegrationTestBase):
"""API网关功能集成测试"""
def setUp(self):
super().setUp()
# 创建一个测试算法
algorithm_data = {
'name': f'Test Gateway Algorithm {self.test_algorithm_id}',
'description': 'Test algorithm for gateway testing',
'type': 'computer_vision',
'status': 'active'
}
response = self.session.post(
f'{self.base_url}/api/v1/algorithms',
json=algorithm_data
)
self.assertEqual(response.status_code, 200)
self.created_algorithm = response.json()
def test_gateway_call(self):
"""测试通过网关调用算法"""
# 通过网关调用算法
call_data = {
'algorithm_id': self.created_algorithm['id'],
'version_id': self.created_algorithm['versions'][0]['id'] if self.created_algorithm['versions'] else None,
'input_data': {
'image_url': 'https://example.com/test-image.jpg'
},
'params': {
'confidence_threshold': 0.7
}
}
response = self.session.post(
f'{self.base_url}/api/v1/gateway/call',
json=call_data
)
self.assertEqual(response.status_code, 200)
gateway_result = response.json()
self.assertIn('id', gateway_result)
self.assertIn('status', gateway_result)
self.assertIn('response_time', gateway_result)
def test_gateway_stats(self):
"""测试网关统计信息"""
response = self.session.get(f'{self.base_url}/api/v1/gateway/stats')
self.assertEqual(response.status_code, 200)
stats = response.json()
self.assertIn('total_requests', stats)
self.assertIn('successful_requests', stats)
self.assertIn('failed_requests', stats)
class TestDataService(IntegrationTestBase):
"""数据服务集成测试"""
def test_data_storage_and_retrieval(self):
"""测试数据存储和检索"""
# 使用数据管理服务
data_manager = DataManager()
# 存储输入数据
input_data = {'image_url': 'https://example.com/test.jpg'}
input_id = data_manager.save_input_data(input_data)
self.assertIsNotNone(input_id)
# 存储输出数据
output_data = {
'predictions': [
{'class': 'cat', 'confidence': 0.95},
{'class': 'dog', 'confidence': 0.87}
]
}
output_id = data_manager.save_output_data(output_data)
self.assertIsNotNone(output_id)
# 检索数据
retrieved_input = data_manager.get_input_data(input_id)
self.assertEqual(retrieved_input, input_data)
retrieved_output = data_manager.get_output_data(output_id)
self.assertEqual(retrieved_output, output_data)
class TestMonitoringService(IntegrationTestBase):
"""监控服务集成测试"""
def test_monitoring_functionality(self):
"""测试监控功能"""
monitoring_service = MonitoringService()
# 检查健康状态
health_status = monitoring_service.get_health_status()
self.assertIsNotNone(health_status)
self.assertIn('status', health_status)
self.assertIn('timestamp', health_status)
self.assertIn('system_metrics', health_status)
# 收集一些指标
metrics_collector = monitoring_service.metrics_collector
metrics_collector.record_api_call('test_endpoint', 1.23, 200)
metrics_collector.record_algorithm_execution('test_alg', 0.98, 'success')
# 获取指标
metrics = metrics_collector.get_current_metrics()
self.assertIsNotNone(metrics)
class TestPermissionsService(IntegrationTestBase):
"""权限服务集成测试"""
def test_permission_management(self):
"""测试权限管理"""
permission_manager = PermissionManager()
# 检查权限
has_permission = permission_manager.check_permission(
user_id=self.test_user_id,
algorithm_id='test-algorithm-123',
permission_type='execute'
)
# 可能没有权限,但至少方法应该不抛异常
self.assertIsInstance(has_permission, bool)
# 添加权限
permission_manager.grant_permission(
user_id=self.test_user_id,
algorithm_id='test-algorithm-123',
permission_type='execute'
)
# 再次检查权限
has_permission_after = permission_manager.check_permission(
user_id=self.test_user_id,
algorithm_id='test-algorithm-123',
permission_type='execute'
)
self.assertTrue(has_permission_after)
class TestServiceManagement(IntegrationTestBase):
"""服务管理集成测试"""
def test_service_registration_and_discovery(self):
"""测试服务注册和发现"""
service_manager = ServiceManager()
# 注册一个测试服务
service_info = {
'name': f'test-service-{int(time.time())}',
'host': 'localhost',
'port': 8080,
'protocol': 'http',
'metadata': {'version': '1.0.0'}
}
registered_service = service_manager.register_service(service_info)
self.assertIsNotNone(registered_service)
# 发现服务
discovered_services = service_manager.discover_services(service_info['name'])
self.assertIn(registered_service['id'], [s['id'] for s in discovered_services])
# 检查服务状态
service_status = service_manager.get_service_status(registered_service['id'])
self.assertIsNotNone(service_status)
class TestHistoryManagement(IntegrationTestBase):
"""历史记录管理集成测试"""
def test_history_operations(self):
"""测试历史记录操作"""
# 先调用一个算法来生成历史记录
algorithm_data = {
'name': f'Test History Algorithm {self.test_algorithm_id}',
'description': 'Test algorithm for history testing',
'type': 'computer_vision',
'status': 'active'
}
response = self.session.post(
f'{self.base_url}/api/v1/algorithms',
json=algorithm_data
)
self.assertEqual(response.status_code, 200)
created_algorithm = response.json()
# 调用算法
call_data = {
'algorithm_id': created_algorithm['id'],
'version_id': created_algorithm['versions'][0]['id'] if created_algorithm['versions'] else None,
'input_data': {'test': 'data'},
'params': {}
}
response = self.session.post(
f'{self.base_url}/api/v1/algorithms/call',
json=call_data
)
self.assertEqual(response.status_code, 200)
call_result = response.json()
# 获取历史记录
response = self.session.get(f'{self.base_url}/api/v1/history/user-calls')
self.assertEqual(response.status_code, 200)
history_data = response.json()
self.assertIn('history', history_data)
self.assertIn('count', history_data)
# 获取统计信息
response = self.session.get(f'{self.base_url}/api/v1/history/statistics')
self.assertEqual(response.status_code, 200)
stats_data = response.json()
self.assertIn('total_calls', stats_data)
self.assertIn('success_rate', stats_data)
class TestOpenAIFunctionality(IntegrationTestBase):
"""OpenAI集成功能测试"""
def test_openai_integration(self):
"""测试OpenAI集成"""
# 检查是否设置了OpenAI API密钥
openai_api_key = os.getenv('OPENAI_API_KEY')
if not openai_api_key:
self.skipTest("OPENAI_API_KEY not set, skipping OpenAI integration test")
# 生成仿真数据
generation_data = {
'prompt': '一个包含猫和狗的图像描述',
'data_type': 'text'
}
response = self.session.post(
f'{self.base_url}/api/v1/openai/generate-data',
json=generation_data
)
# 即使API密钥无效也应该返回合理的错误而不是崩溃
self.assertIn(response.status_code, [200, 401, 500])
if response.status_code == 200:
result = response.json()
self.assertIn('data', result)
self.assertIn('type', result)
class TestFullWorkflow(IntegrationTestBase):
"""完整工作流程集成测试"""
def test_complete_workflow(self):
"""测试完整的端到端工作流程"""
# 1. 创建算法
algorithm_data = {
'name': f'Complete Workflow Test {self.test_algorithm_id}',
'description': 'Algorithm for complete workflow testing',
'type': 'nlp',
'status': 'active'
}
response = self.session.post(
f'{self.base_url}/api/v1/algorithms',
json=algorithm_data
)
self.assertEqual(response.status_code, 200)
created_algorithm = response.json()
self.assertIsNotNone(created_algorithm['id'])
# 2. 通过网关调用算法
call_data = {
'algorithm_id': created_algorithm['id'],
'version_id': created_algorithm['versions'][0]['id'] if created_algorithm['versions'] else None,
'input_data': {
'text': '这是一个测试文本'
},
'params': {
'max_length': 100
}
}
response = self.session.post(
f'{self.base_url}/api/v1/gateway/call',
json=call_data
)
self.assertEqual(response.status_code, 200)
gateway_result = response.json()
self.assertIsNotNone(gateway_result['id'])
self.assertIn('status', gateway_result)
# 3. 验证调用已记录到历史
response = self.session.get(
f'{self.base_url}/api/v1/history/user-calls',
params={'limit': 10}
)
self.assertEqual(response.status_code, 200)
history_data = response.json()
self.assertGreater(len(history_data['history']), 0)
# 4. 检查监控指标
response = self.session.get(f'{self.base_url}/api/v1/monitoring/health')
self.assertEqual(response.status_code, 200)
# 5. 获取算法性能指标
response = self.session.get(
f'{self.base_url}/api/v1/monitoring/performance/algorithm/{created_algorithm["id"]}'
)
self.assertIn(response.status_code, [200, 404]) # 404可能表示没有足够的数据
def run_integration_tests():
"""运行所有集成测试"""
# 创建测试套件
loader = unittest.TestLoader()
suite = unittest.TestSuite()
# 添加所有测试类
test_classes = [
TestAlgorithmManagement,
TestAlgorithmCallFlow,
TestGatewayFunctionality,
TestDataService,
TestMonitoringService,
TestPermissionsService,
TestServiceManagement,
TestHistoryManagement,
TestOpenAIFunctionality,
TestFullWorkflow
]
for test_class in test_classes:
tests = loader.loadTestsFromTestCase(test_class)
suite.addTests(tests)
# 运行测试
runner = unittest.TextTestRunner(verbosity=2)
result = runner.run(suite)
return result.wasSuccessful()
if __name__ == '__main__':
print("开始运行智能算法展示平台集成测试...")
print("=" * 60)
success = run_integration_tests()
print("=" * 60)
if success:
print("✅ 所有集成测试通过!")
sys.exit(0)
else:
print("❌ 部分集成测试失败!")
sys.exit(1)