知っておくと便利!Pytestコマンドライン小ネタ集

Pytestを実行するときに知っておくと便利なコマンド&オプションをまとめました。

環境

  • Python3.6
  • pytest 4.3.0
  • venv

特定のテストのみを実行する

モジュールを指定して実行

モジュール毎にテストを実行します。

    pytest test_1.py

パスを指定して実行

フォルダ別にテストを実行します。

    pytest testing/

キーワードを指定して実行

文字列に含まれるキーワードにマッチするもののみを実行します。
マッチング対象はファイル名、クラス名、関数名です。

    pytest -k "MyClass and not method"

上の例の場合、”TestMyClass”のキーワードを含むテストを実行しますが、”method”キーワードを含むものは除きます。

例えば、 "TestMyClass.test_something" は実行されますが、
”TestMyClass.test_method_simple”は実行されません。

このように文章で記述できるのはPythonらしいですよね。

ノードIDを指定して実行

全てのテスト関数にはそれぞれIDが振られます。
IDの形式は”<モジュール名>::<クラス名 or 関数名 or パラメーター名>”です。
モジュール内のテストを個別に実行したい時に役立ちます。

例えば、以下の書き方だと、test_modモジュールのtest_funcのみを実行します。

    pytest test_mod.py::test_func

以下の書き方の例はmodule内のクラスを指定してtest_method関数を実行します。

    pytest test_mod.py::TestClass::test_method

*パス指定して呼び出す場合*
Pytestコマンドはディレクトリ内の”test”キーワードがあるフォルダ内の関数も探して実行してくれますが、
パス指定をする場合はディレクトリを指定しなければ実行してくれません。

実行元ディレクトリからのパスを入力するようにしましょう。

デコレータ別に実行

以下のコードは@pytest.mark.slowのデコレータが付いている関数のみ実行します。

    pytest -m slow

他のデコレータに付いては Marksを参考にしてください。

n回数失敗したらテストを中止

数を指定して、その回数テストが失敗するとテストを終了し結果を表示します。

pytest -x            # テストに一度でも失敗した時点で停止
pytest --maxfail=2    # テストに二回失敗した時点で停止

テストの停止+デバッガープロンプトの起動

数を指定してテストを停止することができます。
Pytestはビルトインのデバッガー、PDB(Python Debugger)を用いてテストを実行していますが、 --pdbオプションでテストが任意の回数失敗した時点でテストを停止し、PDBプロンプトを表示します。

    pytest -x --pdb   # テストに失敗した時点でテストを中止しPDBプロンプトを起動。
    pytest --pdb --maxfail=3  # テストに3回通らなかった時点でテストを中止しPDBプロンプトを起動。

デバッグモードになったら helpでオプションを表示、もしくはqでデバッグモードを終了します。

テストに失敗した時、実行ログはsys.last_value, sys.last_type and sys.last_tracebackに保存されます。

sysモジュールから手動で例外でログの内容を見たり、他のデバッグツールで分析したりできるようです。

>>> import sys
>>> sys.last_traceback.tb_lineno
42
>>> sys.last_value
AssertionError('assert result == "ok"',)

実行時間を表示する

--durationで実行時間を表示します。

pytest --durations=10  #もっとも時間のかかったテストを順に10表示

処理時間が0.01sより短いものはデフォルトで表示されませんが、
-vvオプションを渡すことで表示させることもできます。

サマリーレポートの表示

*pytest version 2.9以上
全てのテストが終了した後に表示されるサマリーレポートをカスタマイズできます。

-r フラグを使うことでテストの最後に“short test summary info”を表示します。
-rフラグに任意のオプションを指定することで、failures, skips, xfailsなどをサマリーに表示します。

以下オプション一覧です。

  • f - failed
  • E - error
  • s - skipped
  • x - xfailed
  • X - xpassed
  • p - passed
  • P - passed with output
  • a - all except pP

例えば、pytest -rfsの場合、失敗したテストとskipしたテストのショートサマリを表示します。

$ pytest -rfs
=========================== test session starts ============================
platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y
cachedir: $PYTHON_PREFIX/.pytest_cache
rootdir: $REGENDOC_TMPDIR, inifile:
collected 6 items

test_example.py .FEsxX                                               [100%]

================================== ERRORS ==================================
_______________________ ERROR at setup of test_error _______________________

    @pytest.fixture
    def error_fixture():
>       assert 0
E       assert 0

test_example.py:6: AssertionError
================================= FAILURES =================================
________________________________ test_fail _________________________________

    def test_fail():
>       assert 0
E       assert 0

test_example.py:14: AssertionError
========================= short test summary info ==========================
FAILED test_example.py::test_fail
SKIPPED [1] $REGENDOC_TMPDIR/test_example.py:23: skipping this test
    1 failed, 1 passed, 1 skipped, 1 xfailed, 1 xpassed, 1 error in 0.12 seconds
    

まとめ

以上、よく使いそうなコマンドオプションをまとめてみました。
少しでも皆様のpytestライフの助けになれれば幸いです。

参考資料

Usage and Invocations