- 创建了基本的项目结构 - 添加了 .gitignore 文件 - 配置了基本的开发环境 - 添加清华镜像源 - 设置了基础的文件夹和文件(如 commons, utils, POM, pytest.ini) 项目说明: - [项目名称]:Web自动化测试 - [项目描述]:基于pytest,selenium的自动化测试工具 - [开发环境]:Python
138 lines
3.5 KiB
Python
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())
|
|
|