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出力に表示されないように、デコレータを構造化する別の方法はありますか?.
Noseにはすでにこのための組み込みデコレータがあります。
from nose.tools import nottest
@nottest
def test_my_sample_test()
#code here ...
Noseが提供するその他の便利な機能も確認してください。 https://nose.readthedocs.org/en/latest/testing_tools.html
unittest.skip
デコレータ:
import unittest
@unittest.skip("temporarily disabled")
class MyTestCase(unittest.TestCase):
...
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)
クラス、メソッド、または関数の名前をアンダースコアで始めるだけで、鼻はそれを無視します。
@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
この動作は十分に文書化されていませんが、テストを選択するコード クラス名の先頭にあるアンダースコアを明示的にチェックします 。
同様のテストが関数名とメソッド名に対して鼻で実行されるため、名前の先頭にアンダースコアを追加することでそれらを除外できます。