美文网首页
python实现unittest.ddt功能

python实现unittest.ddt功能

作者: 奔跑的大头菜 | 来源:发表于2023-03-05 01:35 被阅读0次

    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

    相关文章

      网友评论

          本文标题:python实现unittest.ddt功能

          本文链接:https://www.haomeiwen.com/subject/mwluldtx.html