禁用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 ...