禁用Python nosetests
在Python中使用nosetests时,可以通过将testing函数的__test__
属性设置为false来禁用unit testing。 我已经实现了这个使用下面的装饰器:
def unit_test_disabled(): def wrapper(func): func.__test__ = False return func return wrapper @unit_test_disabled def test_my_sample_test() #code here ...
但是,这有调用包装器作为unit testing的副作用。 包装将始终通过,但它包括在nosetests输出。 是否还有另一种构造装饰器的方法,以便testing不会运行,并且不会出现在鼻子testing输出中。
我认为你也需要重新命名你的装饰器到没有testing过的东西。下面的testing套件中只有第二个testing失败,第一个testing不会显示在testing套件中。
def unit_disabled(func): def wrapper(func): func.__test__ = False return func return wrapper @unit_disabled def test_my_sample_test(): assert 1 <> 1 def test2_my_sample_test(): assert 1 <> 1
鼻子已经有这样的内build装饰:
from nose.tools import nottest @nottest def test_my_sample_test() #code here ...
另外检查鼻子提供的其他好东西: https : //nose.readthedocs.org/en/latest/testing_tools.html
你也可以使用unittest.skip
装饰器:
import unittest @unittest.skip("temporarily disabled") class MyTestCase(unittest.TestCase): ...
nosetest还有一个skiptest插件,这会导致testing结果中的testing显示被跳过。 这是一个装饰器:
def skipped(func): from nose.plugins.skip import SkipTest def _(): raise SkipTest("Test %s is skipped" % func.__name__) _.__name__ = func.__name__ return _
示例输出:
$ nosetests tests .......................................................................... ..................................S............. ---------------------------------------------------------------------- Ran 122 tests in 2.160s OK (SKIP=1)
你可以用下划线来启动类,方法或函数名,鼻子会忽略它。
@nottest
有它的用途,但我发现它不能很好地工作,当类相互派生,一些基类必须被鼻子忽略。 这经常发生在我有一系列类似的Django视图要testing的时候。 他们经常分享需要testing的特征。 例如,只有具有特定权限的用户才能访问它们。 而不是为所有的人写相同的权限检查,我把这样的共享testing放在其他类从其派生的初始类。 但问题是,基类只能由后面的类派生,并不意味着要自行运行。 这是一个问题的例子:
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__
而从它的运行鼻子的输出:
$ 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
类包含在testing中。
我不能在@nottest
Base
上打@nottest
,因为它会标记整个层次结构。 事实上,如果你只在class Base
前面的代码中添加@nottest
,那么nose将不会运行任何testing。
我所做的是在基类前添加一个下划线:
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
这种行为没有很好的文档记载,但是明确selecttesting的代码会在类名称的起始处检查下划线 。
类似的testing是通过在函数和方法名称上进行的,所以可以通过在名称的开始处添加下划线来排除它们。
也许这将工作:
def unit_test_disabled(f): f.__test__ = False return f @unit_test_disabled def test_my_sample_test() #code here ...