Files
WebAutoTest/commons/settings.py
CNWei 92d06dd9cf init: 初始化项目
- 创建了基本的项目结构
- 添加了 .gitignore 文件
- 配置了基本的开发环境
- 添加清华镜像源
- 设置了基础的文件夹和文件(如 commons, utils, POM, pytest.ini)

项目说明:
- [项目名称]:Web自动化测试
- [项目描述]:基于pytest,selenium的自动化测试工具
- [开发环境]:Python
2025-04-14 23:05:39 +08:00

138 lines
3.5 KiB
Python

#!/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())