我的Python代码中有一些相对复杂的集成测试。我用自定义装饰器大大简化了它们,我对结果非常满意。这是我的装饰器的简单示例:
def specialTest(fn):
def wrapTest(self):
#do some some important stuff
pass
return wrapTest
这是测试的样子:
class Test_special_stuff(unittest.TestCase):
@specialTest
def test_something_special(self):
pass
这很好用,并且由PyCharm的测试运行器执行没有问题。但是,当我使用Nose从命令行运行测试时,它会使用@specialTest装饰器跳过任何测试。 我试图将装饰器命名为testSpecial,因此它匹配默认规则,但是我的FN参数不会被传递。
如何让Nose执行这些测试方法并按照预期处理装饰器?
感谢madjar,我通过使用functools.wraps并更改包装器的名称重构我的代码来实现这一点:
from functools import wraps
def specialTest(fn):
@wraps(fn)
def test_wrapper(self,*args,**kwargs):
#do some some important stuff
pass
return test_wrapper
class Test_special_stuff(unittest.TestCase):
@specialTest
def test_something_special(self):
pass
答案 0 :(得分:24)
如果我没记错的话,鼻子根据他们的名字(名称以test_开头的函数)加载测试。在您发布的代码段中,您不会在包装函数中复制函数的__name__
属性,因此返回的函数的名称为wrapTest
,而nose认为它不是测试。
将函数属性复制到新函数的简单方法是使用functools.wraps
。