鼻子忽略了自定义装饰器的测试

时间:2011-10-11 14:29:15

标签: python decorator ignore nose

我的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

1 个答案:

答案 0 :(得分:24)

如果我没记错的话,鼻子根据他们的名字(名称以test_开头的函数)加载测试。在您发布的代码段中,您不会在包装函数中复制函数的__name__属性,因此返回的函数的名称为wrapTest,而nose认为它不是测试。

将函数属性复制到新函数的简单方法是使用functools.wraps