pytest の呼び出し方法

一般的に、pytest は pytest コマンドで呼び出されます (pytest の他の呼び出し方法 については以下を参照) 。 これにより、現在のディレクトリおよびそのサブディレクトリ内の名前が test_*.py または \*_test.py の形式に従うすべてのファイルのすべてのテストが実行されます。 より一般的には、pytest は 標準のテスト検出ルール に従います。

実行するテストの指定

Pytest は、コマンドラインまたはファイルからテストを実行および選択するためのいくつかの方法をサポートしています (ファイルから引数を読み取る については以下を参照) 。

モジュール内のテストを実行する

pytest test_mod.py

ディレクトリ内のテストを実行する

pytest testing/

キーワード式でテストを実行する

pytest -k 'MyClass and not method'

これにより、指定された 文字列式 (大文字小文字を区別しない) に一致する名前を含むテストが実行されます。 これには、ファイル名、クラス名、および関数名を変数として使用する Python 演算子を含めることができます。 上記の例では、TestMyClass.test_something は実行されますが、TestMyClass.test_method_simple は実行されません。 Windows でこれを実行する場合は、式内で '' の代わりに "" を使用してください。

コレクション引数でテストを実行する

作業ディレクトリに対するモジュールファイル名を渡し、続いてクラス名や関数名などの指定子を :: 文字で区切り、パラメータ化からのパラメータを [] で囲みます。

モジュール内の特定のテストを実行するには:

pytest tests/test_mod.py::test_func

クラス内のすべてのテストを実行するには:

pytest tests/test_mod.py::TestClass

特定のテストメソッドを指定するには:

pytest tests/test_mod.py::TestClass::test_method

テストの特定のパラメータ化を指定するには:

pytest tests/test_mod.py::test_func[x1,y2]

マーカー式でテストを実行する

@pytest.mark.slow デコレータで装飾されたすべてのテストを実行するには:

pytest -m slow

注釈付きの @pytest.mark.slow(phase=1) デコレータで装飾されたすべてのテストを実行するには、phase キーワード引数を 1 に設定します:

pytest -m "slow(phase=1)"

詳細については marks を参照してください。

パッケージからテストを実行する

pytest --pyargs pkg.testing

これにより、pkg.testing がインポートされ、そのファイルシステムの場所を使用してテストが見つかり、実行されます。

ファイルから引数を読み取る

Added in version 8.2.

上記のすべては、@ プレフィックスを使用してファイルから読み取ることができます:

pytest @tests_to_run.txt

ここで、tests_to_run.txt には 1 行ごとにエントリが含まれます。 例:

tests/test_file.py
tests/test_mod.py::test_func[x1,y2]
tests/test_mod.py::TestClass
-m slow

このファイルは pytest --collect-only -q を使用して生成し、必要に応じて変更することもできます。

バージョン、オプション名、環境変数に関するヘルプの取得

pytest --version   # shows where pytest was imported from
pytest --fixtures  # show available builtin function arguments
pytest -h | --help # show help on command line and config file options

テスト実行時間のプロファイリング

バージョン 6.0 で変更.

1.0 秒以上の最も遅い 10 件のテスト時間のリストを取得するには:

pytest --durations=10 --durations-min=1.0

デフォルトでは、pytest はコマンドラインで -vv が渡されない限り、非常に短いテスト時間 (<0.005 秒) を表示しません。

プラグインの読み込みの管理

プラグインの早期読み込み

プラグイン (内部および外部) をコマンドラインで -p オプションを使用して明示的に早期読み込みできます:

pytest -p mypluginmodule

このオプションは name パラメータを受け取ります。 これは次のようになります:

  • 完全なモジュールのドット名、例えば myproject.plugins。 このドット名はインポート可能でなければなりません。

  • プラグインのエントリーポイント名。 これはプラグインが登録されるときに importlib に渡される名前です。 例えば、pytest-cov プラグインを早期読み込みするには、次のように使用できます:

    pytest -p pytest_cov
    

プラグインの無効化

呼び出し時に特定のプラグインの読み込みを無効にするには、プレフィックス no: とともに -p オプションを使用します。

例: テキストファイルから doctest テストを実行する責任がある doctest プラグインの読み込みを無効にするには、次のように pytest を呼び出します:

pytest -p no:doctest

pytest を呼び出す他の方法

python -m pytest を通じて pytest を呼び出す

コマンドラインから Python インタープリタを通じてテストを呼び出すことができます:

python -m pytest [...]

これは、コマンドラインスクリプト pytest [...] を直接呼び出すのとほぼ同等ですが、python を介して呼び出すと、現在のディレクトリも sys.path に追加されます。

Python コードから pytest を呼び出す

Python コードから直接 pytest を呼び出すことができます:

retcode = pytest.main()

これは、コマンドラインから "pytest" を呼び出すかのように動作します。 SystemExit を発生させるのではなく、代わりに 終了コード を返します。 引数を渡さない場合、main はプロセスのコマンドライン引数 (sys.argv) から引数を読み取りますが、これは望ましくない場合があります。 オプションと引数を明示的に渡すことができます:

retcode = pytest.main(["-x", "mytestdir"])

pytest.main に追加のプラグインを指定できます:

# content of myinvoke.py
import sys

import pytest


class MyPlugin:
    def pytest_sessionfinish(self):
        print("*** test run reporting finishing")


if __name__ == "__main__":
    sys.exit(pytest.main(["-qq"], plugins=[MyPlugin()]))

これを実行すると、MyPlugin が追加され、そのフックが呼び出されたことが表示されます:

$ python myinvoke.py
*** test run reporting finishing

注釈

pytest.main() を呼び出すと、テストおよびそれらがインポートするモジュールがインポートされます。 Python のインポートシステムのキャッシュメカニズムのため、同じプロセスから pytest.main() を後続で呼び出しても、呼び出し間のこれらのファイルの変更は反映されません。 このため、同じプロセスから pytest.main() を複数回呼び出すこと (例えば、テストを再実行するため) は推奨されません。