web-dev-qa-db-ja.com

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

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

def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...

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

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

def test_func_two():
    ...

def test_func_three():
    ...

Py.testのドキュメントでこのようなものを検索しましたが、ここで何かが足りないかもしれません。

52
ericmjl

Pytestにはskipおよびskipifデコレーターがあり、Python unittestモジュール(skipおよびskipIfを使用)に似ています。これらはドキュメントにあります here =。

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

@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番目の例ではテストを条件付きでスキップできます(テストがプラットフォーム、実行可能バージョン、またはオプションライブラリに依存する場合に最適です)。

たとえば、誰かがテストのためにライブラリpandasをインストールしているかどうかを確認したい場合。

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():
    ...
78

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(...)
16
alecxe

減価償却されているかどうかはわかりませんが、テスト内でpytest.skip関数を使用することもできます。

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

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

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

この場合、Pytestは引き続きテストを実行し、合格または今すぐにテストを実行しますが、文句を言わずビルドを中断しません。

4
Ruben Gasparian