使用参数化模块链接装饰器



我正在为一个特定问题寻求帮助。我们正在编写测试套件,其中一个测试用例包含一个包含函数的类。此函数是我们的测试用例。测试用例由一个htmltestrunner执行。如果一些测试用例针对不同的参数测试类似的行为,我们将借助模块parameterezy-to-specify:withparameterize.expand对这个测试用例进行参数化,该模块是一个包装器。现在,为了进行更有效的日志记录,我们想在一个单独的模块中编写一个函数,称为扩展日志记录。这应该作为PARAMETERIZED函数的包装器。

这意味着:参数化->WRAPS->高级日志记录->WRAPS->测试用例函数

不,我为我的高级日志记录功能写了以下代码(仅用于调试和测试(:

def decorator_func(func):
print(Fore.RED +"Got into decorator_func")
def wrapped_func(*args, **kwargs):
print(Fore.GREEN + "Got into wrapped_func")

try:
print("Got in")
retval = func(*args, **kwargs)
print("Finished")
except Exception as failure:
print("FAILURE: " + str(failure))
if type(failure) == AssertionError:
print("ASSERTION ERROR")
raise
else:
raise
return retval
return wrapped_func

当我不使用参数化包装器来参数化我的测试用例时,该函数就起作用了。如果我使用参数化包装,我会发现错误:"NoneType"对象不可调用。

有人能帮我吗?搜索了一整天。

编辑:我已经发现,那个参数化的扩展返回"NoneType对象";。有什么方法可以从parameterized.expand中获得修饰函数作为return吗?

我通过在内部函数上添加@wrap(func(解决了这个问题

def decorator_func(func):
print(Fore.RED +"Got into decorator_func")
@wrap(func)  
def wrapped_func(*args, **kwargs):
print(Fore.GREEN + "Got into wrapped_func")

try:
print("Got in")
retval = func(*args, **kwargs)
print("Finished")
except Exception as failure:
print("FAILURE: " + str(failure))
if type(failure) == AssertionError:
print("ASSERTION ERROR")
raise
else:
raise
return retval
return wrapped_func

我不知道为什么它有效,但它确实有效。

最新更新