66 lines
1.9 KiB
Python
66 lines
1.9 KiB
Python
#!/usr/bin/env python
|
|
# coding=utf-8
|
|
|
|
"""
|
|
@author: chen wei
|
|
@Software: PyCharm
|
|
@contact: t6i888@163.com
|
|
@file: models.py
|
|
@date: 2024 2024/9/15 21:14
|
|
@desc: 声明yaml用例格式
|
|
"""
|
|
import logging
|
|
from typing import Union, Optional
|
|
from dataclasses import dataclass, field
|
|
|
|
import yaml
|
|
|
|
from commons import settings
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@dataclass
|
|
class RequestModel:
|
|
method: str
|
|
url: str
|
|
headers: Optional[dict] = None
|
|
# body: Optional[Union[dict, str]] = None
|
|
params: Optional[Union[dict, str]] = None
|
|
|
|
|
|
@dataclass
|
|
class TestCaseModel:
|
|
title: str
|
|
request: RequestModel
|
|
extract: dict
|
|
validate: dict
|
|
parametrize: list = field(default_factory=list)
|
|
epic: str = field(default_factory=lambda: settings.allure_epic)
|
|
feature: str = field(default_factory=lambda: settings.allure_feature)
|
|
story: str = field(default_factory=lambda: settings.allure_story)
|
|
|
|
def __post_init__(self):
|
|
# 必填字段非空校验
|
|
if self.title is None:
|
|
raise ValueError("Title cannot be empty")
|
|
|
|
# 校验RequestModel
|
|
if isinstance(self.request, dict):
|
|
try:
|
|
self.request = RequestModel(**self.request) # RequestModel 的 __post_init__ 会被调用
|
|
except (TypeError, ValueError) as e:
|
|
raise ValueError(f"解析 'request' 字段失败: {e} (数据: {self.request})") from e
|
|
elif not isinstance(self.request, RequestModel): # 如果不是 dict 也不是 RequestModel
|
|
raise TypeError(
|
|
f"字段 'request' 必须是字典 (将在内部转换为 RequestModel) 或 RequestModel 实例, "
|
|
f"得到的是 {type(self.request).__name__}"
|
|
)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
with open(r'E:\PyP\InterfaceAutoTest\TestCases\answer\test_1_status.yaml', encoding='utf-8') as f:
|
|
data = yaml.safe_load(f)
|
|
# print(data)
|
|
case_info = TestCaseModel(**data)
|