ddt函数内部逻辑说明:
1、调用ddt这个函数时会把测试类当成参数传入进来
2、获取测试的所有属性和方法,进行遍历
3、判断遍历出来的属性或方法有没有设置标记的属性(可以使用测试数据字段标记,并将测试数据设置成属性值)
4、如果有则说明这个方法用data装饰器装饰过
5、通过属性值获取所有的用例数据进行遍历
6、每遍历出来一条数据,生成一个用例方法名, 再动态的给测试类添加用例方法
7、遍历完所有用例数据之后,删除测试类原来定义的测试方法
8、最后返回测试类
def ddt(cls):
# 1、获取到cls的所有属性和方法
attrs = list(cls.__dict__.items())
# 2、遍历所有属性和方法
for FuncName, FuncValue in attrs:
# 3、判断是否被标记
if hasattr(FuncValue, "params"):
# 4、获取到测试用例数据
case_datas = FuncValue.params
# 5、遍历测试数据,拿到每组数据和对应的下标
for index, case_data in enumerate(case_datas, 1):
# 6、修改根据下标后新的测试用例方法名
latestMethodName = "{}_{}".format(FuncName, index)
# 7、拿到改写后方法
latestMethod = rewrite_method(FuncValue, case_data)
# 8、给这个类新增方法
setattr(cls, latestMethodName, latestMethod)
else:
# 9、删除初始不需要执行的用例方法
delattr(cls, FuncName)
return cls
def data(datas):
def mark_method(func):
# 给测试用例方法加个params标记
func.params = datas
return func
return mark_method
# 改写测试用例方法,可以接收测试数据
# 传入方法和对应的方法数据
def rewrite_method(test_method, case_datas):
def lock_data(self):
# 改写方法设置,可以传入一个参数
test_method(self, case_datas)
return lock_data
网友评论