web-dev-qa-db-ja.com

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出力に表示されないように、デコレータを構造化する別の方法はありますか?.

50
Richard Dorman

Noseにはすでにこのための組み込みデコレータがあります。

from nose.tools import nottest

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

Noseが提供するその他の便利な機能も確認してください。 https://nose.readthedocs.org/en/latest/testing_tools.html

146

unittest.skip デコレータ:

import unittest


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

Nosetestのskiptestプラグインもあります。これにより、テスト出力にテストショーがスキップされます。これはそのためのデコレータです:

def skipped(func):
    from nose.plugins.skip import SkipTest
    def _():
        raise SkipTest("Test %s is skipped" % func.__name__)
    _.__= func.__name__
    return _

出力例:

$ nosetests tests
..........................................................................
..................................S.............
----------------------------------------------------------------------
Ran 122 tests in 2.160s

OK (SKIP=1)
31

クラス、メソッド、または関数の名前をアンダースコアで始めるだけで、鼻はそれを無視します。

@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クラスはテストに含まれています。

階層全体をマークするため、Base@nottestを平手打ちすることはできません。実際、上記のコードの@nottestの前にclass Baseを追加するだけでは、noseはテストを実行しません。

私がすることは、基本クラスの前にアンダースコアを追加することです:

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

この動作は十分に文書化されていませんが、テストを選択するコード クラス名の先頭にあるアンダースコアを明示的にチェックします

同様のテストが関数名とメソッド名に対して鼻で実行されるため、名前の先頭にアンダースコアを追加することでそれらを除外できます。

7
Louis