web-dev-qa-db-ja.com

Pytest:テストの選択解除

Pytestでは、デコレータを使用してテストをマークできます

@pytest.mark.slow
def some_slow_test():
    pass

次に、コマンドラインから、「遅い」とマークされたテストをスキップするようにpytestに指示できます

pytest -k-slow

追加のタグがある場合:

@pytest.mark.long
def some_long_test()
    pass

長いテストと遅いテストの両方をスキップできるようにしたいと思います。私はこれを試しました:

pytest -k-slow -k-long

この:

pytest -k-slow,long

そしてどちらもうまくいかないようです。

コマンドラインで、pytestに遅いテストと長いテストの両方をスキップするように指示するにはどうすればよいですか?

45
JS.

さらに、最近追加された「-m」コマンドラインオプションを使用すると、次のように記述できるはずです。

py.test -m "not (slow or long)"

IOW、 "-m"オプションは、マーカーをブール値として使用できる式を受け入れます(マーカーがテスト関数に存在しない場合、その値はFalseで、存在する場合はTrueです)。

59
hpk42

pytestコード(mark.py)とさらに実験すると、次のように機能するようです:

pytest -k "-slow -long"

--collect-onlyオプションは実験をスピードアップします)

13
JS.

マークデコレータをスタックすることもできます。

_@pytest.mark.slow
@pytest.mark.main
def test_myfunction():
    pass
_

次に_py.test -m "slow and main"_を呼び出し、両方のデコレータを使用したテストのみが呼び出されました。

py.test -m "not (slow and main)"の結果、他のテストが実行されました

7
dmmfll

pythonファイル内からテストを実行しようとしている場合、つまり、

$ python testfile.py

内容物あり

import pytest

pytest.main()

cLIフラグをpytest.mainに渡す方法を知りたい場合、答えは次のとおりです。

pytest.main(["-m", "not slow"])

PS-はい、このようにテストを呼び出す正当な理由があります。それらを学ぶ必要がないように祈ってください。

0
Sam H.