如果你以下划线开头命名类、方法或函数,nose会忽略它。
@nottest
有它的用处,但我发现当类彼此派生时,有些基类必须被nose忽略时,它并不起作用。这在我需要测试一系列相似Django视图时经常发生。它们通常共享需要测试的特征。例如,它们只能由具有某些权限的用户访问。我将这样的共享测试放在一个初始类中,其他类从该类派生。然而问题在于,基类仅供后面的类派生使用,不适合自己运行。以下是问题示例:
from unittest import TestCase
class Base(TestCase):
def test_something(self):
print "Testing something in " + self.__class__.__name__
class Derived(Base):
def test_something_else(self):
print "Testing something else in " + self.__class__.__name__
并且运行nose的输出为:
$ nosetests test.py -s
Testing something in Base
.Testing something in Derived
.Testing something else in Derived
.
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
测试中包括 Base
类。
我不能只是在 Base
上随便加上 @nottest
,因为它会标记整个继承体系。实际上,如果你只在上面的代码中添加 @nottest
到 class Base
前面,那么 nose 将不会运行任何测试。
我所做的是在基类前面添加下划线:
from unittest import TestCase
class _Base(TestCase):
def test_something(self):
print "Testing something in " + self.__class__.__name__
class Derived(_Base):
def test_something_else(self):
print "Testing something else in " + self.__class__.__name__
当运行它时,_Base
将被忽略:
$ nosetests test3.py -s
Testing something in Derived
.Testing something else in Derived
.
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
这种行为并没有很好的文档说明,但是选择测试的代码明确检查了类名开始处是否有下划线。
Nose也会对函数和方法名执行类似的测试,因此可以通过在名称开头添加下划线来排除它们。
@nottest
类继承,并仍然可以将后代标记为@istest
。我相信我已经到处寻找如何实现这种行为,而这是唯一一个在不拆开代码的情况下工作的方法。(嵌套后代类以避免鼻子的跟踪器使整个事情看起来很糟糕 :/) - Rubens