对Python使用nosetests时,可以通过将测试函数的__test__
属性设置为false来禁用单元测试。我使用以下装饰器实现了这个:
def unit_test_disabled():
def wrapper(func):
func.__test__ = False
return func
return wrapper
@unit_test_disabled
def test_my_sample_test()
#code here ...
但是,这会产生调用包装器作为单元测试的副作用。包装将始终通过,但它包含在nosetests输出中。是否有另一种构造装饰器的方法,以便测试不会运行,也不会出现在nosetests输出中。
答案 0 :(得分:144)
Nose已经有了内置装饰器:
from nose.tools import nottest
@nottest
def test_my_sample_test()
#code here ...
另请查看鼻子提供的其他好东西:https://nose.readthedocs.org/en/latest/testing_tools.html
答案 1 :(得分:64)
您还可以使用unittest.skip
装饰器:
import unittest
@unittest.skip("temporarily disabled")
class MyTestCase(unittest.TestCase):
...
答案 2 :(得分:31)
还有一个用于nosetest的skiptest插件,它会导致测试输出中的测试显示被跳过。这是装饰者:
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)
答案 3 :(得分:6)
您可以使用下划线启动类,方法或函数名称,而鼻子会忽略它。
@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__
来自鼻子的输出:
$ 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
类包含在测试中。
我不能只在@nottest
上打Base
因为它会标记整个层次结构。实际上,如果您只是在@nottest
前面的代码中添加class Base
,那么鼻子就不会运行任何测试。
我所做的是在基类前添加一个下划线:
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
此行为没有详细记录,但是选择测试explicitly checks for an underscore at the start of class names的代码。
通过鼻子对函数和方法名称执行类似的测试,因此可以通过在名称的开头添加下划线来排除它们。
答案 4 :(得分:-17)
我认为您还需要将装饰器重命名为尚未测试的内容。以下仅在第二次测试时失败,第一次测试未显示在测试套件中。
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