Python单元测试:理解装饰器问题
最近几天,我在python中测试了一些自动化单元测试的技术,比如C#中的TestCase 我知道有些框架支持这种技术,但我将更详细地学习python,因此我想了解这一点 对我来说,下面的帖子有一个很好的答案(来自Xavier Decoret),所以我尝试了一下,结果非常好,但我不能毫无例外地堆叠装饰器 简而言之,我的两段代码,结果异常和环境:Python单元测试:理解装饰器问题,python,unit-testing,decorator,Python,Unit Testing,Decorator,最近几天,我在python中测试了一些自动化单元测试的技术,比如C#中的TestCase 我知道有些框架支持这种技术,但我将更详细地学习python,因此我想了解这一点 对我来说,下面的帖子有一个很好的答案(来自Xavier Decoret),所以我尝试了一下,结果非常好,但我不能毫无例外地堆叠装饰器 简而言之,我的两段代码,结果异常和环境: import sys def for_examples(*parameters): def tuplify(x): if not isi
import sys
def for_examples(*parameters):
def tuplify(x):
if not isinstance(x, tuple):
return (x,)
return x
def decorator(method, parameters=parameters):
for parameter in (tuplify(x) for x in parameters):
def method_for_parameter(self, method=method, parameter=parameter):
method(self, *parameter)
args_for_parameter = ",".join(repr(v) for v in parameter)
name_for_parameter = method.__name__ + "(" + args_for_parameter + ")"
frame = sys._getframe(1) # pylint: disable-msg=W0212
frame.f_locals[name_for_parameter] = method_for_parameter
return None
return decorator
希望有人能帮助我理解我的问题,我们可以找到一个可堆叠的解决方案。你复制的装饰器不是设计用来这样使用的 原因是这一行:
return None
通常,装饰程序应该返回装饰过的函数,而不是None
。然而,在这种情况下,装饰器故意不返回一个函数,因此UNITTEST不认为它是一个测试用例。
好在这根本不是问题,因为
@for_examples(1, 2)
@for_examples(3, 4)
相当于
@for_examples(1, 2, 3, 4)
你复制的装饰器不是设计成那样使用的 原因是这一行:
return None
通常,装饰程序应该返回装饰过的函数,而不是None
。然而,在这种情况下,装饰器故意不返回一个函数,因此UNITTEST不认为它是一个测试用例。
好在这根本不是问题,因为
@for_examples(1, 2)
@for_examples(3, 4)
相当于
@for_examples(1, 2, 3, 4)
是的,我只使用了一个装饰器进行了测试,但就我的理解而言,我知道为什么使用两个装饰器是不可能的。必须更改运行两次的内容。我已经测试了返回类型的一些变体,但没有得到令人满意的结果。当我使用参数的
method\u作为返回类型时,不会从测试框架执行任何操作。@rené“正确”的返回值应该是method
。但是你会有一个额外的测试用例,它总是会失败,因为它没有收到任何参数。是的,我只使用了一个decorator对它进行了测试,但是根据我的理解,我知道为什么使用两个decorator是不可能的。必须更改运行两次的内容。我已经测试了返回类型的一些变体,但没有得到令人满意的结果。当我使用参数
的method\u作为返回类型时,不会从测试框架执行任何操作。@rené“正确”的返回值应该是method
。但是,您将有一个额外的测试用例,它总是会失败,因为它没有收到任何参数。