python实现unittest.ddt功能

2023-03-05  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读