通过python中的装饰器实现unittest中的ddt和data模块的封装
实现代码如下
def decorate(method, values):
"""用来保存测试用例方法数据的闭包函数"""
def wrapper(self):
method(self, values)
return wrapper
def ddt(cls):
"""用来获取测试数据,给测试类动态添加测试方法"""
# 获取类的属性字典
attr = cls.__dict__
# 循环获取类的属性字典,判断其对应的属性字典中的值是否存在DATA属性,如果存在,说明data装饰器装饰过
for key, value in list(attr.items()):
# 判断对应的属性值中是否存在DATAS
if hasattr(value, 'DATAS'):
# 如果存在DATAS,则获取DATAS中的值
data = getattr(value, 'DATAS')
# 遍历data的值
for index, items in enumerate(data):
# 根据测试数据动态添加测试方法
method_name = "{}_{}".format(key, int(index) + 1)
# 测试方法有测试数据,故将value的要定义在一个闭包函数中
new_class_method = decorate(value, items)
setattr(cls, method_name, new_class_method)
# 有几条测试数据,就有几条测试用例,故将原先的测试方法删除
delattr(cls, key)
return cls
def data(*args):
"""将测试数据保存到data的一个属性中"""
def wrapper(func):
# 将测试数据保存到函数的DATAS的属性中
setattr(func, 'DATAS', args)
return func
return wrapper
case = [
{"name": "fji", "age": 18},
{"name": "fji", "age": 18},
{"name": "fji", "age": 18},
{"name": "fji", "age": 18}
]
import unittest
@ddt # @ddt=>TestDemo=ddt(TestDemo)
class TestDemo(unittest.TestCase):
@data(*case) #@data=> test_demo=data(case)(test_demo)
def test_demo(self, items):
print("----test_demo-----", items)