装饰器扩展练习-实现DDT
题目:自己实现 unittest 中 数据驱动中使用到的 ddt
import unittest
from functools import wraps
def data(*args):
"""
装饰 方法的
:param args: 传入的参数
:return:
"""
def wrapper(func):
setattr(func, "PARAMS", args)
# func.PARAMS = args
return func
return wrapper
def add_value(func, new_name, *args):
""
对方法进行传参操作
""
@wraps(func)
def wrapper(self):
return func(self, *args)
wrapper.__name__ = new_name
# wrapper.__wrapped__ = func
return wrapper
def ddt(cls):
"""
装饰 类的
:param cls: 类对象
:return:
"""
# 获取到 类里 全部的对象 方法以及 属性
dict_method = cls.__dict__
for method_name, method_value in list(dict_method.items()):
# 判断是否有 PARAMS 对应的属性
if hasattr(method_value, "PARAMS"):
# 获取 方法里 params 的属性
params_data = getattr(method_value,"PARAMS")
for i, value in enumerate(params_data):
case_name = f'{method_name}_{value}'
# 给类对象中设置新方法,并且将 参数输入到 方法中
setattr(cls, case_name, add_value(method_value, case_name, value))
# 删除类对象中初始方法
delattr(cls, method_name)
return cls
@ddt
class Demo(unittest.TestCase):
@data("1221", "22", 33, 44, 55, 66)
def test_demo1(self, param):
print(f"这个是测试用例,用例的参数为:{param}")
执行后的效果是: