- 引入 SmartInt 和 SmartDict 类型,支持 YAML 占位符与业务类型的自动转换。 - 优化 CaseInfo 互斥校验逻辑,确保 request 与 api_action 二选一。 - 统一使用 Pydantic V2 的 model_config 规范。 - 将变量替换时机提前至模型实例化之前,支持占位符在校验前完成真实值注入, 保证了 int/bool 等字段的类型转换正确性。 - 优化断言渲染时机,支持响应提取值关联。
99 lines
2.8 KiB
Python
99 lines
2.8 KiB
Python
#!/usr/bin/env python
|
|
# coding=utf-8
|
|
|
|
"""
|
|
@author: chen wei
|
|
@Software: PyCharm
|
|
@contact: t6i888@163.com
|
|
@file: files.py
|
|
@date: 2024 2024/9/15 21:28
|
|
@desc: 读取和保存yaml文件
|
|
"""
|
|
import logging
|
|
from pathlib import Path
|
|
import yaml
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class YamlFile(dict):
|
|
def __init__(self, path=None, data=None):
|
|
super().__init__()
|
|
self.path = Path(path) if path else None
|
|
|
|
if data:
|
|
self.update(data)
|
|
elif self.path:
|
|
if self.path.is_dir():
|
|
raise IsADirectoryError(f"The path {self.path} is a directory, not a file.")
|
|
self.load()
|
|
|
|
def load(self):
|
|
if not self.path:
|
|
logger.warning("No path specified for YamlFile, cannot load.")
|
|
return self
|
|
|
|
if self.path.exists() and self.path.is_file():
|
|
with open(self.path, "r", encoding="utf-8") as f:
|
|
loaded_data = yaml.safe_load(f) or {}
|
|
self.clear()
|
|
self.update(loaded_data)
|
|
else:
|
|
logger.warning(f"File not found at {self.path}, YamlFile initialized as empty.")
|
|
self.clear()
|
|
return self
|
|
|
|
def to_yaml(self) -> str:
|
|
return yaml.safe_dump(
|
|
dict(self),
|
|
allow_unicode=True,
|
|
sort_keys=False
|
|
)
|
|
|
|
@classmethod
|
|
def by_yaml(cls, yaml_str):
|
|
data = yaml.safe_load(yaml_str) or {}
|
|
return cls(data=data)
|
|
|
|
def save(self):
|
|
if not self.path:
|
|
raise ValueError("Cannot save YamlFile instance without a specified path.")
|
|
|
|
# 确保父目录存在
|
|
self.path.parent.mkdir(parents=True, exist_ok=True)
|
|
|
|
with open(self.path, "w", encoding="utf-8") as f:
|
|
yaml.safe_dump(
|
|
dict(self),
|
|
stream=f,
|
|
allow_unicode=True,
|
|
sort_keys=False
|
|
)
|
|
return self
|
|
|
|
|
|
if __name__ == '__main__':
|
|
from core.models import CaseInfo
|
|
from core.settings import TEST_CASE_DIR
|
|
|
|
# 1. 创建一个用于测试的临时yaml文件
|
|
dummy_path = TEST_CASE_DIR / "test_model_demo.yaml"
|
|
dummy_data = {
|
|
"title": "Get user info",
|
|
"request": {"method": "GET", "url": "/users/1"},
|
|
"validate": [{"equals": ["status_code", 200]}]
|
|
}
|
|
YamlFile(path=dummy_path, data=dummy_data).save()
|
|
print(f"--- 已创建临时测试文件: {dummy_path}")
|
|
|
|
# 2. 加载文件并使用Pydantic模型进行校验
|
|
yaml_case = YamlFile(dummy_path)
|
|
print("\n--- 已加载YAML内容 ---\n", yaml_case.to_yaml())
|
|
case_model = CaseInfo(**yaml_case)
|
|
print("\n--- Pydantic模型校验成功 ---")
|
|
print(case_model.model_dump_json(indent=2, by_alias=True))
|
|
|
|
# 3. 清理临时文件
|
|
dummy_path.unlink()
|
|
print(f"\n--- 已清理临时文件: {dummy_path}")
|