52

__test__Pythonでnosetestsを使用する場合、テスト関数の属性を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の出力に表示されないようにデコレータを構造化する別の方法はありますか?

4

5 に答える 5

156

Noseには、このためのデコレータがすでに組み込まれています。

from nose.tools import nottest

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

noseが提供する他のグッズもチェックしてください:https ://nose.readthedocs.org/en/latest/testing_tools.html

于 2009-12-03T21:39:10.543 に答える
74

unittest.skipデコレータを使用することもできます。

import unittest


@unittest.skip("temporarily disabled")
class MyTestCase(unittest.TestCase):
    ...
于 2015-02-20T14:06:06.997 に答える
32

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)
于 2011-10-07T13:08:28.233 に答える
9

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

@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は、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

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

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

于 2016-05-13T16:59:47.853 に答える
-17

また、デコレータの名前をテストされていないものに変更する必要があると思います。以下は、2番目のテストでのみ失敗し、最初のテストはテストスイートに表示されません。

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
于 2009-07-13T15:57:44.303 に答える