ddt:
1、遍历测试类中所有的属性和方法(找出拥有PARAMS属性的方法)
所有的属性和方法: 类.__dict__
for k ,v in 属性字典:
if 判断遍历出的方法是否拥有PARAMS属性

2、通过PARAMS属性,获取到data传入的测试数据
getattr(obj,属性)

3、遍历测试数据,给测试类动态的添加测试方法(添加test开头的方法)
datas = (11, 22, 33, 44, 55, 66)
# 遍历数据给测试类动态添加测试用例
for i, v in enumerate(datas):
case_name = 'test_musen_{}'.format(i)
# 给测试类动态添加测试方法
setattr(TestLogin, case_name, demo)

data:将数据保存为test_demo1的一个属性PARAMS

def data(*args):
# args:传入的测试数据
def wrapper(func):
# func:被装饰的方法(函数)
setattr(func, 'PARAMS', args)
return func

return wrapper

def create_new_case_method(method, value):
def wrapper(self):
method(self, value)

return wrapper

def ddt(cls):
# 获取类所有的属性和方法
attrs = cls.__dict__
print(attrs)
# 遍历所有的属性和方法
for attr_name, attr_value in list(attrs.items()):
# 判断遍历出来的属性或者方法拥有PARAMS属性
if hasattr(attr_value, 'PARAMS'):
# 获取用例数据
datas = attr_value.PARAMS
for index, value in enumerate(datas):
# 创建一个新的方法名
case_name = attr_name + '_{}'.format(index + 1)
# 获取被data装饰的方法
case_method = attr_value
new_method = create_new_case_method(case_method, value)
# 给测试类动态添加方法
setattr(cls, case_name, new_method)
# 删除测试类中原有的测试方法
delattr(cls, attr_name)

return cls

python函数拓展:

getattr()函数:用于返回一个对象属性值

语法:getattr(object, name[, default])

参数:

  • object---对象
  • name---字符串,对象属性
  • default--默认返回值,如果不提供该参数,在没有对应属性时,讲触发AttributeError

返回值:返回对象属性值

hasattr()函数:用于判断对象是否包含对应的属性

语法:hasattr(object, name)

参数:

  • object---对象
  • name---字符串,属性名

返回值:如果对象有该属性返回True,否则返回False

setattr()函数:对应函数getattr(),用于设置属性值,该属性不一定是存在的

语法:setattr(object, name, value)

参数:

  • object---对象
  • name---字符串,对象属性
  • value---属性值

delattr():用于删除属性

语法:delattr(object, name)

  • object---对象
  • name---必须是对象的属性