pytestを使用してテストを無効にするにはどうすればよいですか?


88

たくさんのテストがあるとしましょう:

def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...

pytestそのテストだけを実行できないようにするために関数に追加できるデコレータなどはありますか?結果は次のようになります...

@pytest.disable()
def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...

回答:


137

Pytestには、Pythonユニットテストモジュール(とを使用)skipと同様のskipおよびskipifデコレータskipIfがあります。これは、こちらのドキュメントにあります

リンクからの例はここにあります:

@pytest.mark.skip(reason="no way of currently testing this")
def test_the_unknown():
    ...

import sys
@pytest.mark.skipif(sys.version_info < (3,3),
                    reason="requires python3.3")
def test_function():
    ...

最初の例では常にテストをスキップし、2番目の例では条件付きでテストをスキップできます(テストがプラットフォーム、実行可能バージョン、またはオプションのライブラリに依存している場合に最適です。

たとえば、誰かがテスト用にライブラリパンダをインストールしているかどうかを確認したい場合です。

import sys
try:
    import pandas as pd
except ImportError:
    pass

@pytest.mark.skipif('pandas' not in sys.modules,
                    reason="requires the Pandas library")
def test_pandas_function():
    ...

.skipMocha(Node.js)が持っているエレガントに似たものはありますか?it('tests something'...)->it.skip('tests something'...)その特定のテストを無効にします。また、その反対の便利な機能もあり.onlyます。これは、そのテストのみを実行し、他には何も実行しません。
JuhaUntinen18年

つまり、only一部の場合、コマンドラインまたはテストランナーの初期化に使用するものを介してそれを行うことができます:stackoverflow.com/a/36539692/4131059 とについてはitit.skipここの機能がそれを完全にカバーしていると思います。
AlexanderHuszagh18年

21

skipデコレータは、仕事をするだろう。

@pytest.mark.skip(reason="no way of currently testing this")
def test_func_one():
    # ...

reason引数はオプションですが、テストをスキップする理由を指定することをお勧めします)。

skipif()特定の条件が満たされた場合にテストを無効にできる機能もあります。


これらのデコレータは、メソッド、関数、またはクラスに適用できます。

モジュール内のすべてのテストスキップするには、グローバルpytestmark変数を定義します。

# test_module.py
pytestmark = pytest.mark.skipif(...)

10

非推奨かどうかはわかりませんpytest.skipが、テスト内で関数を使用することもできます。

def test_valid_counting_number():
     number = random.randint(1,5)
     if number == 5:
         pytest.skip('Five is right out')
     assert number <= 3

2
参考のために滞在し、pytest助けを求めに来た
Uzebeckatrente

それは何を参照していますか。私が知っている必要があります
XChikuX


これは私の時代よりずっと前のことだったと思います。しかし、私は今それを知ってうれしいです。
XChikuX

6

テストが失敗すると思われる場合でも、テストを実行することをお勧めします。このようなシナリオでは、https://docs.pytest.org/en/latest/skipping.htmlでデコレータ@ pytest.mark.xfailを使用することをお勧めします

@pytest.mark.xfail
def test_function():
    ...

この場合、Pytestは引き続きテストを実行し、合格かどうかを通知しますが、文句を言ったりビルドを中断したりすることはありません。


2

テストをスキップしたいがマーカーをハードコーディングしたくない場合は、キーワード式を使用してエスケープすることをお勧めします。

pytest test/test_script.py -k 'not test_func_one'

2

でテストをスキップする場合は、skipskipifデコレータを使用してテストにマークを付けることができますpytest

テストをスキップする

@pytest.mark.skip(reason="no way of currently testing this")
def test_func_one():
    ...

テストをスキップする最も簡単な方法skipは、オプションのに合格する可能性のあるデコレータでテストをマークすることですreason

pytest.skip(reason)関数を呼び出すことにより、テストの実行中またはセットアップ中に命令的にスキップすることもできます。これは、インポート時にスキップ条件を評価できない場合に役立ちます。

def test_func_one():
    if not valid_config():
        pytest.skip("unsupported configuration")

条件に基づいてテストをスキップする

@pytest.mark.skipif(sys.version_info < (3, 6), reason="requires python3.6 or higher")
def test_func_one():
    ...

条件に基づいてスキップしたい場合は、skipif代わりに使用できます。前の例では、Python3.6より前のインタープリターで実行すると、テスト関数はスキップされます。

最後に、失敗していることが確実であるためにテストをスキップする場合は、xfailマーカーを使用して、テストが失敗することを予期していることを示すことも検討してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.