ai-hackaton-backend/test_system.py

313 lines
11 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.

#!/usr/bin/env python3
"""
Тестирование HR-AI системы по компонентам
"""
import asyncio
import sys
from pathlib import Path
import requests
# Добавляем корневую директорию в PYTHONPATH
sys.path.append(str(Path(__file__).parent))
async def test_database_connection():
"""Тест подключения к PostgreSQL"""
print("Testing database connection...")
try:
from sqlalchemy import select
from app.core.database import get_db
from app.models.resume import Resume
# Получаем async сессию
async for db in get_db():
# Пробуем выполнить простой запрос
result = await db.execute(select(Resume).limit(1))
resumes = result.scalars().all()
print("OK Database: connection successful")
print(f"Found resumes in database: {len(resumes)}")
return True
except Exception as e:
print(f"FAIL Database: connection error - {str(e)}")
return False
async def test_rag_system():
"""Тест RAG системы (парсинг резюме)"""
print("\n🔍 Тестируем RAG систему...")
try:
from rag.llm.model import ResumeParser
from rag.registry import registry
# Инициализируем модели
chat_model = registry.get_chat_model()
# embeddings_model = registry.get_embeddings_model()
print("✅ RAG система: модели инициализированы")
# Тестируем парсер резюме
parser = ResumeParser(chat_model)
# Создаем тестовый текст резюме
test_resume_text = """
Иван Петров
Python разработчик
Опыт работы: 3 года
Навыки: Python, Django, PostgreSQL, Docker
Образование: МГУ, факультет ВМК
"""
parsed_resume = parser.parse_resume_text(test_resume_text)
print("✅ RAG система: парсинг резюме работает")
print(f"📋 Распарсенные данные: {parsed_resume}")
return True
except Exception as e:
print(f"❌ RAG система: ошибка - {str(e)}")
return False
def test_redis_connection():
"""Тест подключения к Redis"""
print("\n🔍 Тестируем подключение к Redis...")
try:
import redis
from rag.settings import settings
r = redis.Redis(
host=settings.redis_cache_url,
port=settings.redis_cache_port,
db=settings.redis_cache_db,
)
# Пробуем ping
r.ping()
print("✅ Redis: подключение успешно")
return True
except Exception as e:
print(f"❌ Redis: ошибка подключения - {str(e)}")
print(
"💡 Для запуска Redis используйте: docker run -d -p 6379:6379 redis:alpine"
)
return False
async def test_celery_tasks():
"""Тест Celery задач"""
print("\n🔍 Тестируем Celery задачи...")
try:
print("✅ Celery: задачи импортируются")
print(
"💡 Для полного теста запустите: celery -A celery_worker.celery_app worker --loglevel=info"
)
return True
except Exception as e:
print(f"❌ Celery: ошибка - {str(e)}")
return False
async def test_interview_service():
"""Тест сервиса интервью (без LiveKit)"""
print("\n🔍 Тестируем сервис интервью...")
try:
from app.core.database import get_db
from app.services.interview_service import InterviewRoomService
async for db in get_db():
service = InterviewRoomService(db)
# Тестируем генерацию токена (должен работать даже без LiveKit сервера)
try:
token = service.generate_access_token("test_room", "test_user")
print("✅ Interview Service: генерация токенов работает")
print(f"🎫 Тестовый токен сгенерирован (длина: {len(token)})")
except Exception as e:
print(f"⚠️ Interview Service: ошибка токена - {str(e)}")
# Тестируем fallback план интервью
fallback_plan = service._get_fallback_interview_plan()
print("✅ Interview Service: fallback план работает")
print(f"📋 Структура плана: {list(fallback_plan.keys())}")
return True
except Exception as e:
print(f"❌ Interview Service: ошибка - {str(e)}")
return False
def test_ai_agent_import():
"""Тест импорта AI агента"""
print("\n🔍 Тестируем AI агента...")
try:
from ai_interviewer_agent import InterviewAgent
# Тестовый план интервью
test_plan = {
"interview_structure": {
"duration_minutes": 15,
"greeting": "Привет! Тест интервью",
"sections": [
{
"name": "Знакомство",
"duration_minutes": 5,
"questions": ["Расскажи о себе"],
},
{
"name": "Опыт",
"duration_minutes": 10,
"questions": ["Какой у тебя опыт?"],
},
],
},
"candidate_info": {
"name": "Тестовый кандидат",
"skills": ["Python"],
"total_years": 2,
},
}
agent = InterviewAgent(test_plan)
print("✅ AI Agent: импорт и инициализация работают")
print(f"📊 Секций в плане: {len(agent.sections)}")
print(f"🎯 Текущая секция: {agent.get_current_section().get('name')}")
# Тестируем извлечение системных инструкций
instructions = agent.get_system_instructions()
print(f"📝 Инструкции сгенерированы (длина: {len(instructions)})")
return True
except Exception as e:
print(f"❌ AI Agent: ошибка - {str(e)}")
return False
def check_external_services():
"""Проверка внешних сервисов"""
print("\n🔍 Проверяем внешние сервисы...")
# Проверяем Milvus
try:
from rag.settings import settings
response = requests.get(f"{settings.milvus_uri}/health", timeout=5)
if response.status_code == 200:
print("✅ Milvus: сервер доступен")
else:
print("⚠️ Milvus: сервер недоступен")
except Exception:
print("❌ Milvus: сервер недоступен")
# Проверяем LiveKit (если запущен)
try:
# LiveKit health check обычно на HTTP порту
livekit_http_url = settings.livekit_url.replace("ws://", "http://").replace(
":7880", ":7880"
)
response = requests.get(livekit_http_url, timeout=2)
print("✅ LiveKit: сервер запущен")
except Exception:
print("❌ LiveKit: сервер не запущен")
print(
"💡 Для запуска LiveKit используйте Docker: docker run --rm -p 7880:7880 -p 7881:7881 livekit/livekit-server --dev"
)
async def run_all_tests():
"""Запуск всех тестов"""
print("=== HR-AI System Testing ===")
print("=" * 50)
tests = [
("Database", test_database_connection),
("RAG System", test_rag_system),
("Redis", lambda: test_redis_connection()),
("Celery", test_celery_tasks),
("Interview Service", test_interview_service),
("AI Agent", lambda: test_ai_agent_import()),
]
results = {}
for test_name, test_func in tests:
try:
if asyncio.iscoroutinefunction(test_func):
result = await test_func()
else:
result = test_func()
results[test_name] = result
except Exception as e:
print(f"{test_name}: критическая ошибка - {str(e)}")
results[test_name] = False
# Проверяем внешние сервисы
check_external_services()
# Итоговый отчет
print("\n" + "=" * 50)
print("📊 ИТОГОВЫЙ ОТЧЕТ")
print("=" * 50)
passed = sum(1 for r in results.values() if r)
total = len(results)
for test_name, result in results.items():
status = "✅ PASS" if result else "❌ FAIL"
print(f"{test_name:20} {status}")
print(f"\n🎯 Результат: {passed}/{total} тестов прошли успешно")
if passed == total:
print("🎉 Система готова к тестированию!")
print_next_steps()
else:
print("⚠️ Некоторые компоненты требуют настройки")
print_troubleshooting()
def print_next_steps():
"""Следующие шаги для полного тестирования"""
print("\n📋 СЛЕДУЮЩИЕ ШАГИ:")
print("1. Запустите FastAPI сервер: uvicorn app.main:app --reload")
print(
"2. Запустите Celery worker: celery -A celery_worker.celery_app worker --loglevel=info"
)
print("3. Загрузите тестовое резюме через /resume/upload")
print("4. Проверьте генерацию плана интервью в базе данных")
print("5. Для полного теста голосовых интервью потребуются:")
print(" - API ключи Deepgram/Cartesia")
print(" - LiveKit сервер")
def print_troubleshooting():
"""Устранение неисправностей"""
print("\n🔧 УСТРАНЕНИЕ ПРОБЛЕМ:")
print("• Redis не запущен: docker run -d -p 6379:6379 redis:alpine")
print("• Milvus недоступен: проверьте настройки MILVUS_URI")
print("• RAG ошибки: проверьте OPENAI_API_KEY")
print("• База данных: проверьте DATABASE_URL и запустите alembic upgrade head")
if __name__ == "__main__":
asyncio.run(run_all_tests())