web-dev-qa-db-ja.com

py.testロギングコントロール

最近、pythonテストのためにpy.testに切り替えました(これは素晴らしいことです)。ただし、ログ出力(つまり、組み込みpythonロギングモジュール)を制御する方法を理解しようとしています。 pytest-capturelogがインストールされていて、これは期待どおりに動作し、ログを表示したい場合は--nologcaptureオプションを渡します。

ただし、ロギングレベル(たとえば、情報、デバッグなど)をどのように制御し、ロギングをフィルタリングしますか(特定のモジュールのみに関心がある場合)。これを達成するためのpy.testの既存のプラグインはありますか、それとも独自に作成する必要がありますか?

ありがとう、ジョニー

30
jjh

pytest-capturelogプラグイン をインストールして使用すると、pytest/loggingのニーズのほとんどを満たすことができます。何かが足りない場合、比較的簡単に実装できるはずです。

9
hpk42

Holgerが言ったように pytest-capturelog を使用できます:

def test_foo(caplog):
    caplog.setLevel(logging.INFO)
    pass

Pytest-capturelogを使用したくない場合は、ロギング構成でstdout StreamHandler を使用して、pytestがログ出力をキャプチャできるようにします。次に例を示します basicConfig

logging.basicConfig(level=logging.DEBUG, stream=sys.stdout)
9
Aron Curzon

少し遅い投稿ですが、簡単なドロップインロギングキャプチャソリューションとして pytest-logging をお勧めします。 pip install pytest-loggingの後で、(画面に表示される)ログの詳細度を制御できます。

$ py.test -s -v tests/your_test.py
$ py.test -s -vv tests/your_test.py
$ py.test -s -vvvv tests/your_test.py

etc ... NB--sフラグは重要です。フラグがない場合、py.testはすべてのsys.stderr情報を除外します。

8
danodonovan

Pytestはcaplogフィクスチャを介してロギングコントロールをネイティブでサポートするようになりました。プラグインは必要ありません。

特定のロガーまたはデフォルトでルートロガーのログレベルを指定できます。

import pytest

def test_bar(caplog):
    caplog.set_level(logging.CRITICAL, logger='root.baz')

Pytestはまた、ログ出力をcaplog.recordsログに記録されたレベルとメッセージをアサートできます。詳細については、公式ドキュメント here および here を参照してください。

2
Alaya

さらに後の貢献の少し: pytest-logger を試すことができます。このプラグインの目新しさはファイルシステムへのロギングです:pytestは各テスト項目のノードIDを提供し、これを使用してテストセッションログディレクトリを整理できます(pytest tmpdir機能とそのテストケース開始/終了フックを使用)。

端末とファイルシステムの複数のハンドラー(レベル付き)を個別に構成し、ロガー/レベルをフィルター処理するための独自のコマンドラインオプションを提供して、特定のテスト環境で機能させることができます。デフォルトでは、すべてをファイルシステムに記録し、一部を端末に記録できます。必要に応じて、--logオプションを使用してセッションごとに変更できます。ユーザーがフックを定義していない場合、プラグインはデフォルトでは何もしません。

1
aurzenligl