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 个回答
24
如果我没记错的话,nose会根据测试函数的名字来加载测试,这些函数的名字都是以test_开头的。在你发的代码片段中,你在包装函数里没有复制原函数的__name__
属性,所以返回的函数名字是wrapTest
,nose就认为这不是一个测试。
一个简单的方法来把原函数的属性复制到新函数上,就是使用functools.wraps
。