init: 初始化项目
- 创建了基本的项目结构 - 添加了 .gitignore 文件 - 配置了基本的开发环境 - 添加清华镜像源 - 设置了基础的文件夹和文件(如 commons, utils, POM, pytest.ini) 项目说明: - [项目名称]:Web自动化测试 - [项目描述]:基于pytest,selenium的自动化测试工具 - [开发环境]:Python
This commit is contained in:
137
commons/settings.py
Normal file
137
commons/settings.py
Normal file
@@ -0,0 +1,137 @@
|
||||
#!/usr/bin/env python
|
||||
# coding=utf-8
|
||||
|
||||
"""
|
||||
@author: CNWei
|
||||
@Software: PyCharm
|
||||
@contact: t6i888@163.com
|
||||
@file: settings
|
||||
@date: 2025/2/23 21:34
|
||||
@desc:
|
||||
"""
|
||||
|
||||
import logging
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
import tomlkit
|
||||
|
||||
ROOT_PATH = (Path(__file__)).resolve().parents[1] # 获取根路径(绝对路径)
|
||||
|
||||
EXPLICIT_WAIT_TIMEOUT = 10
|
||||
|
||||
DATA_ROOT = ROOT_PATH / "data"
|
||||
|
||||
if not DATA_ROOT.exists():
|
||||
DATA_ROOT.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# 配置文件路
|
||||
CONF_PATH = Path(DATA_ROOT, "settings.toml")
|
||||
|
||||
# 截图保存路径
|
||||
SCREENSHOT_DIR = Path(ROOT_PATH, "screenshot")
|
||||
|
||||
if not SCREENSHOT_DIR.exists():
|
||||
SCREENSHOT_DIR.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# 测试案例路径
|
||||
CASES_DIR = Path(ROOT_PATH, "tests")
|
||||
|
||||
# 变量替换
|
||||
EXCHANGER = Path(ROOT_PATH, "extract.toml")
|
||||
|
||||
# 自增ID
|
||||
ID_PATH = Path(ROOT_PATH, "id.toml")
|
||||
|
||||
# 默认配置
|
||||
DEFAULT_CONF = {
|
||||
"SCREENSHOT_DIR": SCREENSHOT_DIR,
|
||||
"CASES_DIR": CASES_DIR,
|
||||
"EXCHANGER": EXCHANGER,
|
||||
"ID_PATH": ID_PATH,
|
||||
}
|
||||
|
||||
|
||||
class Settings:
|
||||
"""
|
||||
配置管理类 (单例模式 Singleton Pattern)。
|
||||
|
||||
优先从项目根目录下的 'settings.toml' 文件加载配置。
|
||||
如果 'settings.toml' 文件不存在、无法解析或缺少某个配置项,
|
||||
则使用此类中定义的默认值。
|
||||
|
||||
通过创建类的唯一实例 `settings` 来全局访问配置。
|
||||
"""
|
||||
_instance = None
|
||||
|
||||
# --- 单例实现 ---
|
||||
def __new__(cls, *args, **kwargs):
|
||||
"""
|
||||
实现单例模式。确保全局只有一个 Settings 实例。
|
||||
"""
|
||||
if not cls._instance:
|
||||
cls._instance = super().__new__(cls, *args, **kwargs)
|
||||
# 初始化只进行一次
|
||||
cls._instance._initialized = False
|
||||
return cls._instance
|
||||
|
||||
def __init__(self):
|
||||
"""
|
||||
初始化配置。仅在第一次创建实例时执行。
|
||||
"""
|
||||
# 防止重复初始化 (单例模式下可能会被多次调用 __init__)
|
||||
if self._initialized:
|
||||
return
|
||||
self._initialized = True
|
||||
|
||||
logging.info("开始初始化配置...")
|
||||
self._init_config()
|
||||
self._load_config()
|
||||
|
||||
def _init_config(self):
|
||||
"""初始化配置文件"""
|
||||
if not CONF_PATH.exists():
|
||||
CONF_PATH.parent.mkdir(parents=True, exist_ok=True)
|
||||
CONF_PATH.touch()
|
||||
# self._save_config(DEFAULT_CONF)
|
||||
return self
|
||||
|
||||
def _load_config(self):
|
||||
with open(CONF_PATH, 'r', encoding='utf-8') as f:
|
||||
result = tomlkit.parse(f.read())
|
||||
logging.debug(f"加载 settings.toml 文件 ===> {result}")
|
||||
|
||||
new_conf = DEFAULT_CONF | result
|
||||
for key, value in new_conf.items():
|
||||
|
||||
self.__setattr__(key, value)
|
||||
return self
|
||||
|
||||
def _save_config(self, data: dict[str, Any]):
|
||||
"""保存配置到文件"""
|
||||
for key, value in data.items():
|
||||
if isinstance(value, Path):
|
||||
data[key] = value.as_posix()
|
||||
with open(CONF_PATH, 'w', encoding='utf-8') as f:
|
||||
tomlkit.dump(data=data, fp=f, sort_keys=False)
|
||||
return self
|
||||
|
||||
def __setattr__(self, key, value):
|
||||
self.__dict__[key] = value
|
||||
|
||||
def items(self):
|
||||
conf: dict = {}
|
||||
for key, value in self.__dict__.items():
|
||||
if not key.startswith('_'):
|
||||
conf[key] = value
|
||||
# return self.__dict__.items()
|
||||
return conf
|
||||
|
||||
|
||||
configs = Settings()
|
||||
|
||||
# --- 用于直接运行此文件进行测试 ---
|
||||
if __name__ == '__main__':
|
||||
...
|
||||
print(configs.items())
|
||||
|
||||
Reference in New Issue
Block a user