import os import yaml from pathlib import Path from dotenv import load_dotenv from core.singleton import Singleton class ConfigManager(metaclass=Singleton): def __init__(self): self.config = {} self._logger = None # 延迟初始化日志记录器 self.load_environment_variables() self.load_config_files() def set_logger(self, logger): """设置日志记录器(延迟初始化)""" self._logger = logger def log(self, level, message): """记录日志(如果日志记录器已初始化)""" if self._logger: if level == 'debug': self._logger.debug(message) elif level == 'info': self._logger.info(message) elif level == 'warning': self._logger.warning(message) elif level == 'error': self._logger.error(message) elif level == 'critical': self._logger.critical(message) else: # 如果日志记录器尚未初始化,使用简单的打印 print(f"[{level.upper()}] {message}") def load_environment_variables(self): """加载环境变量""" load_dotenv() self.env_vars = { 'BROWSER': os.getenv('BROWSER', 'chrome'), 'HEADLESS': os.getenv('HEADLESS', 'false').lower() == 'true', 'BASE_URL': os.getenv('BASE_URL', 'https://example.com'), 'ENVIRONMENT': os.getenv('ENVIRONMENT', 'dev'), 'DB_HOST': os.getenv('DB_HOST', 'localhost'), 'DB_PORT': os.getenv('DB_PORT', '3306'), 'DB_NAME': os.getenv('DB_NAME', 'test_db'), 'DB_USER': os.getenv('DB_USER', 'root'), 'DB_PASSWORD': os.getenv('DB_PASSWORD', ''), 'SMTP_SERVER': os.getenv('SMTP_SERVER', 'smtp.gmail.com'), 'SMTP_PORT': os.getenv('SMTP_PORT', '587'), 'SMTP_USERNAME': os.getenv('SMTP_USERNAME', ''), 'SMTP_PASSWORD': os.getenv('SMTP_PASSWORD', ''), } self.log('info', "环境变量加载完成") def load_config_files(self): """加载配置文件""" try: config_path = Path(__file__).parent.parent.parent / 'resources' / 'config' # 加载主配置 main_config_file = config_path / 'config.yaml' if main_config_file.exists(): with open(main_config_file, 'r') as f: self.config.update(yaml.safe_load(f)) # 加载环境配置 env = self.env_vars['ENVIRONMENT'] env_config_file = config_path / 'environments' / f'{env}.yaml' if env_config_file.exists(): with open(env_config_file, 'r') as f: self.config.update(yaml.safe_load(f)) # 加载测试数据 test_data_file = config_path / 'test_data.yaml' if test_data_file.exists(): with open(test_data_file, 'r') as f: self.config['test_data'] = yaml.safe_load(f) self.log('info', "配置文件加载成功") except Exception as e: self.log('error', f"配置文件加载失败: {str(e)}") raise def get(self, key, default=None): """获取配置值""" keys = key.split('.') value = self.config for k in keys: if isinstance(value, dict) and k in value: value = value[k] else: return self.env_vars.get(key, default) return value def get_browser_config(self): """获取浏览器配置""" return { 'browser': self.get('browser.type', self.env_vars['BROWSER']), 'headless': self.get('browser.headless', self.env_vars['HEADLESS']), 'implicit_wait': self.get('browser.implicit_wait', 10), 'explicit_wait': self.get('browser.explicit_wait', 30), 'window_size': self.get('browser.window_size', (1920, 1080)) } def get_db_config(self): """获取数据库配置""" return { 'host': self.get('database.host', self.env_vars['DB_HOST']), 'port': self.get('database.port', int(self.env_vars['DB_PORT'])), 'name': self.get('database.name', self.env_vars['DB_NAME']), 'user': self.get('database.user', self.env_vars['DB_USER']), 'password': self.get('database.password', self.env_vars['DB_PASSWORD']), 'driver': self.get('database.driver', 'mysql') }