99 lines
3.1 KiB
Python
99 lines
3.1 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 dataclasses import dataclass, asdict
|
||
|
||
import allure
|
||
import yaml
|
||
|
||
from commons.templates import Template
|
||
from commons import settings
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
|
||
@dataclass
|
||
class CaseInfo:
|
||
title: str
|
||
request: dict
|
||
extract: dict
|
||
validate: dict
|
||
parametrize: list = ""
|
||
epic: str = settings.allure_epic
|
||
feature: str = settings.allure_feature
|
||
story: str = settings.allure_story
|
||
|
||
def to_yaml(self) -> str:
|
||
# 序列化成yaml字符串
|
||
yaml_str = yaml.safe_dump(
|
||
asdict(self),
|
||
allow_unicode=True, # allow_unicode:使用unicode编码正常显示中文
|
||
sort_keys=False)
|
||
return yaml_str
|
||
|
||
@classmethod
|
||
def by_yaml(cls, yaml_str):
|
||
# 反序列化
|
||
obj = cls(**yaml.safe_load(yaml_str))
|
||
return obj
|
||
|
||
@allure.step("断言")
|
||
def assert_all(self):
|
||
if not self.validate:
|
||
return
|
||
for assert_type, assert_value in self.validate.items():
|
||
for msg, data in assert_value.items():
|
||
a, b = data[0], data[1]
|
||
# print(assert_type, a, b, msg)
|
||
match assert_type:
|
||
case 'equals':
|
||
logger.info(f"assert {a} == {b}, {msg}")
|
||
assert a == b, msg
|
||
case 'not_equals':
|
||
logger.info(f"assert {a} != {b}, {msg}")
|
||
assert a != b, msg
|
||
case 'contains':
|
||
logger.info(f"assert {a} in {b}, {msg}")
|
||
assert a in b, msg
|
||
case 'not_contains':
|
||
logger.info(f"assert {a} not in {b}, {msg}")
|
||
assert a not in b, msg
|
||
# case "xxxxx
|
||
|
||
def ddt(self) -> list: # 返回一个列表,列表中应该包含N个注入了变量的caseInfo
|
||
case_list = []
|
||
if not self.parametrize: # 没有使用数据驱动测试
|
||
case_list.append('')
|
||
else: # 使用数据驱动测试
|
||
args_name = self.parametrize[0]
|
||
args_value_list = self.parametrize[1:]
|
||
for args_value in args_value_list:
|
||
d = dict(zip(args_name, args_value))
|
||
# d 就是数据驱动测试的变量,应输入到用例中
|
||
case_info_str = self.to_yaml() # 转字符串
|
||
case_info_str = Template(case_info_str).render(d) # 输入变量
|
||
case_info = self.by_yaml(case_info_str) # 转成类
|
||
|
||
case_list.append(case_info) # 加入到返回值
|
||
return case_list
|
||
|
||
|
||
if __name__ == '__main__':
|
||
with open(r'E:\PyP\InterfaceAutoTest\TestCases\test_1_user.yaml', encoding='utf-8') as f:
|
||
data = yaml.safe_load(f)
|
||
# print(data)
|
||
case_info = CaseInfo(**data)
|
||
s = case_info.to_yaml()
|
||
print(s)
|
||
new_case_info = case_info.by_yaml(s)
|
||
print(new_case_info)
|