禁用的Python nosetests(Disabling Python nosetests)

2019-06-25 18:30发布

当使用用于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输出的另一种方式。

Answer 1:

我想你也将需要重命名你的装饰的东西,还没有得到测试。以下仅失败对我的第二次测试,并先不测试套件现身。

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


Answer 2:

鼻子已经为这一个内置的装饰:

from nose.tools import nottest

@nottest
def test_my_sample_test()
    #code here ...

还检查了其他东西是鼻子规定: https://nose.readthedocs.org/en/latest/testing_tools.html



Answer 3:

您还可以使用unittest.skip装饰:

import unittest


@unittest.skip("temporarily disabled")
class MyTestCase(unittest.TestCase):
    ...


Answer 4:

还存在一个skiptest插件nosetest,这将导致测试显示在测试输出作为跳过。 下面是一个装饰:

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)


Answer 5:

你可以只启动以下划线类,方法或函数的名称和鼻子会忽略它。

@nottest有它的用途,但我发现,当类从彼此获得一些基类必须由鼻子被忽略了它不能很好地工作。 当我有一系列的类似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类包含在测试中。

我不能只拍@nottestBase ,因为这将标志着整个层次。 事实上,如果你只需要添加@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

这种行为是不是有据可查而是选择测试的代码明确检查在类名的开头下划线 。

类似的测试是通过鼻子函数和方法的名称执行,从而有可能通过在名称的开头添加下划线将它们排除在外。



文章来源: Disabling Python nosetests