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是在类定义完执行才调用的

posted @ 2022-08-09 17:28  上官夏洛特  阅读(28)  评论(0编辑  收藏  举报