| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- 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')
- }
|