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是在类定义完执行才调用的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?