Tests/config/settings.py
2026-01-19 23:32:11 +04:00

168 lines
6.4 KiB
Python

import logging
from typing import Dict, Any
from pathlib import Path
from config.environment import EnvironmentLoader
# Инициализация логгера
logger = logging.getLogger(__name__)
class Settings:
"""Основные настройки приложения"""
# Загрузка переменных окружения
ENV = EnvironmentLoader.get_env_variable('ENV', 'development')
DEBUG = EnvironmentLoader.get_env_variable('DEBUG', False)
# Базовые URL
API_BASE_URL = EnvironmentLoader.get_env_variable('API_BASE_URL', 'http://localhost:8080/api/v1')
UI_BASE_URL = EnvironmentLoader.get_env_variable('UI_BASE_URL', 'http://localhost:5173')
# Настройки логирования
LOG_LEVEL = EnvironmentLoader.get_env_variable('LOG_LEVEL', 'INFO').upper()
LOG_FORMAT = EnvironmentLoader.get_env_variable(
'LOG_FORMAT',
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
LOG_FILE = EnvironmentLoader.get_env_variable('LOG_FILE', 'logs/tests.log')
# Настройки тестов
TEST_TIMEOUT = EnvironmentLoader.get_env_variable('TEST_TIMEOUT', 30) # секунды
TEST_RETRIES = EnvironmentLoader.get_env_variable('TEST_RETRIES', 3)
TEST_PARALLEL_WORKERS = EnvironmentLoader.get_env_variable('TEST_PARALLEL_WORKERS', 'auto')
# Настройки Allure
ALLURE_RESULTS_DIR = EnvironmentLoader.get_env_variable('ALLURE_RESULTS_DIR', 'allure-results')
ALLURE_REPORT_DIR = EnvironmentLoader.get_env_variable('ALLURE_REPORT_DIR', 'allure-report')
# Настройки ожиданий
IMPLICIT_WAIT = EnvironmentLoader.get_env_variable('IMPLICIT_WAIT', 10) # секунды
EXPLICIT_WAIT = EnvironmentLoader.get_env_variable('EXPLICIT_WAIT', 30) # секунды
POLL_FREQUENCY = EnvironmentLoader.get_env_variable('POLL_FREQUENCY', 0.5) # секунды
# Базовые пути
PROJECT_ROOT = Path(__file__).parent.parent
TESTS_DIR = PROJECT_ROOT / 'tests'
DATA_DIR = TESTS_DIR / 'data'
REPORTS_DIR = PROJECT_ROOT / 'reports'
# Создание необходимых директорий
@classmethod
def create_directories(cls):
"""Создание необходимых директорий"""
directories = [
cls.REPORTS_DIR,
cls.DATA_DIR,
Path(cls.LOG_FILE).parent if cls.LOG_FILE else None,
Path(cls.ALLURE_RESULTS_DIR).parent if cls.ALLURE_RESULTS_DIR else None,
]
for directory in directories:
if directory and not directory.exists():
directory.mkdir(parents=True, exist_ok=True)
logger.debug(f"Created directory: {directory}")
@classmethod
def get_logging_config(cls) -> Dict[str, Any]:
"""Конфигурация логирования"""
return {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': cls.LOG_FORMAT,
'datefmt': '%Y-%m-%d %H:%M:%S',
},
'detailed': {
'format': '%(asctime)s - %(name)s - %(levelname)s - %(module)s:%(lineno)d - %(message)s',
'datefmt': '%Y-%m-%d %H:%M:%S',
},
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'level': cls.LOG_LEVEL,
'formatter': 'standard',
'stream': 'ext://sys.stdout',
},
'file': {
'class': 'logging.FileHandler',
'level': cls.LOG_LEVEL,
'formatter': 'detailed',
'filename': cls.LOG_FILE,
'mode': 'a',
},
},
'loggers': {
'': { # root logger
'handlers': ['console', 'file'],
'level': cls.LOG_LEVEL,
'propagate': True,
},
'tests': {
'handlers': ['console', 'file'],
'level': cls.LOG_LEVEL,
'propagate': False,
},
'api': {
'handlers': ['console', 'file'],
'level': cls.LOG_LEVEL,
'propagate': False,
},
'ui': {
'handlers': ['console', 'file'],
'level': cls.LOG_LEVEL,
'propagate': False,
},
},
}
@classmethod
def setup_logging(cls):
"""Настройка логирования"""
import logging.config
logging.config.dictConfig(cls.get_logging_config())
logger.info(f"Logging configured with level: {cls.LOG_LEVEL}")
@classmethod
def validate(cls):
"""Валидация настроек"""
# Проверка обязательных переменных
EnvironmentLoader.validate_environment()
# Проверка URL
import validators
if not validators.url(cls.API_BASE_URL):
logger.warning(f"API_BASE_URL might be invalid: {cls.API_BASE_URL}")
if not validators.url(cls.UI_BASE_URL):
logger.warning(f"UI_BASE_URL might be invalid: {cls.UI_BASE_URL}")
# Создание директорий
cls.create_directories()
logger.info(f"Settings validated for environment: {cls.ENV}")
@classmethod
def print_summary(cls):
"""Вывод сводки настроек"""
summary = f"""
===== Environment Settings =====
Environment: {cls.ENV}
Debug Mode: {cls.DEBUG}
API Base URL: {cls.API_BASE_URL}
UI Base URL: {cls.UI_BASE_URL}
Log Level: {cls.LOG_LEVEL}
Test Timeout: {cls.TEST_TIMEOUT}s
Test Retries: {cls.TEST_RETRIES}
Parallel Workers: {cls.TEST_PARALLEL_WORKERS}
=================================
"""
logger.info(summary)
# Инициализация настроек при импорте
Settings.validate()
Settings.setup_logging()
Settings.print_summary()
# Экспорт настроек
settings = Settings