python---自己实现ddt
import unittest
class Myddt:
def ddt(self, cls):
for attrname, method in list(cls.__dict__.items()):
# 判断带有数据的测试方法
if hasattr(method, 'params'):
params_data = getattr(method, 'params')
for i, v in enumerate(params_data):
if hasattr(method, 'unpack'):
if isinstance(v, (tuple, list)):
setattr(cls, f'test_{i}', self.create_test_fun(method, *v))
elif isinstance(v, dict):
setattr(cls, f'test_{i}', self.create_test_fun(method, **v))
else:
setattr(cls, f'test_{i}', self.create_test_fun(method, v))
else:
delattr(cls, attrname)
return cls
def create_test_fun(self, fun, *args, **kwargs):
def inner(self):
fun(self, *args, **kwargs)
return inner
@staticmethod
def data(*args):
def inner(fun):
setattr(fun, 'params', args)
return fun
return inner
@staticmethod
def unpack(fun):
setattr(fun, 'unpack', True)
return fun
md = Myddt()
data = [
{"case_id": 1, 'title': "第一条测试"},
{"case_id": 2, 'title': "第二条测试"},
{"case_id": 3, 'title': "第三条测试"}
]
@md.ddt
class TestDdt(unittest.TestCase):
@md.data(*data)
@md.unpack
def test_001(self, case_id, title):
print(case_id, title)
if __name__ == '__main__':
unittest.main()
之前一直有疑问:类和类的方法同时使用了装饰器,执行顺序是怎么样的
牢记同一级别代码块的代码从上往下执行,这个原则永远都不会变
调用md.ddt 传入测试类,需要先定义测试类,定义测试类 就会加载类属性和方法。
加载类内部的属性和方法,就会执行到@md.data
@md.data是在定义测试类的时候调用的。 md.ddt是在类定义完执行才调用的