禁用Python测试

时间:2009-07-13 15:27:28

标签: python nosetests

对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输出中。

5 个答案:

答案 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