バージョン3.3以降、pytest
ライブロギングをサポートします。つまり、テストで出力されたすべてのログレコードがすぐに端末に出力されます。この機能は、ライブログセクションに記載されています。ライブロギングはデフォルトで無効になっています。有効にするにlog_cli = 1
は、pyproject.toml
1またはpytest.ini
2構成で設定します。ライブロギングは、端末とファイルへの送信をサポートしています。関連するオプションにより、レコードのカスタマイズが可能になります。
ターミナル:
log_cli_level
log_cli_format
log_cli_date_format
ファイル:
log_file
log_file_level
log_file_format
log_file_date_format
注:log_cli
フラグはコマンドラインから渡すことはできず、で設定する必要がありますpytest.ini
。他のすべてのオプションは、コマンドラインから渡すことも、構成ファイルで設定することもできます。によって指摘ケビンバレでこのコメントを介して行うことができ、コマンドラインからのiniオプションをオーバーライドし、-o/--override
オプション。したがって、で宣言する代わりlog_cli
にpytest.ini
、次のように呼び出すことができます。
$ pytest -o log_cli=true ...
例
デモンストレーションに使用される簡単なテストファイル:
import logging
LOGGER = logging.getLogger(__name__)
def test_eggs():
LOGGER.info('eggs info')
LOGGER.warning('eggs warning')
LOGGER.error('eggs error')
LOGGER.critical('eggs critical')
assert True
ご覧のとおり、追加の構成は必要ありません。コマンドラインでpytest
指定された、pytest.ini
またはコマンドラインから渡されたオプションに基づいて、ロガーを自動的にセットアップします。
ターミナル、INFO
レベル、ファンシー出力へのライブロギング
構成pyproject.toml
:
[tool.pytest.ini_options]
log_cli = true
log_cli_level = "INFO"
log_cli_format = "%(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)"
log_cli_date_format = "%Y-%m-%d %H:%M:%S"
レガシーと同じ構成pytest.ini
:
[pytest]
log_cli = 1
log_cli_level = INFO
log_cli_format = %(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)
log_cli_date_format=%Y-%m-%d %H:%M:%S
テストの実行:
$ pytest test_spam.py
=============================== test session starts ================================
platform darwin -- Python 3.6.4, pytest-3.7.0, py-1.5.3, pluggy-0.7.1 -- /Users/hoefling/.virtualenvs/stackoverflow/bin/python3.6
cachedir: .pytest_cache
rootdir: /Users/hoefling/projects/private/stackoverflow/so-4673373, inifile: pytest.ini
collected 1 item
test_spam.py::test_eggs
---------------------------------- live log call -----------------------------------
2018-08-01 14:33:20 [ INFO] eggs info (test_spam.py:7)
2018-08-01 14:33:20 [ WARNING] eggs warning (test_spam.py:8)
2018-08-01 14:33:20 [ ERROR] eggs error (test_spam.py:9)
2018-08-01 14:33:20 [CRITICAL] eggs critical (test_spam.py:10)
PASSED [100%]
============================= 1 passed in 0.01 seconds =============================
ターミナルとファイルへのライブロギング、ターミナルのメッセージとCRITICAL
レベルのみ、pytest.log
ファイルの派手な出力
構成pyproject.toml
:
[tool.pytest.ini_options]
log_cli = true
log_cli_level = "CRITICAL"
log_cli_format = "%(message)s"
log_file = "pytest.log"
log_file_level = "DEBUG"
log_file_format = "%(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)"
log_file_date_format = "%Y-%m-%d %H:%M:%S"
レガシーと同じ構成pytest.ini
:
[pytest]
log_cli = 1
log_cli_level = CRITICAL
log_cli_format = %(message)s
log_file = pytest.log
log_file_level = DEBUG
log_file_format = %(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)
log_file_date_format=%Y-%m-%d %H:%M:%S
試運転:
$ pytest test_spam.py
=============================== test session starts ================================
platform darwin -- Python 3.6.4, pytest-3.7.0, py-1.5.3, pluggy-0.7.1 -- /Users/hoefling/.virtualenvs/stackoverflow/bin/python3.6
cachedir: .pytest_cache
rootdir: /Users/hoefling/projects/private/stackoverflow/so-4673373, inifile: pytest.ini
collected 1 item
test_spam.py::test_eggs
---------------------------------- live log call -----------------------------------
eggs critical
PASSED [100%]
============================= 1 passed in 0.01 seconds =============================
$ cat pytest.log
2018-08-01 14:38:09 [ INFO] eggs info (test_spam.py:7)
2018-08-01 14:38:09 [ WARNING] eggs warning (test_spam.py:8)
2018-08-01 14:38:09 [ ERROR] eggs error (test_spam.py:9)
2018-08-01 14:38:09 [CRITICAL] eggs critical (test_spam.py:10)
1 pyproject.toml
はバージョン6.0以降でサポートされており、IMOに最適なオプションです。参照PEP 518を仕様のため。
2セクションの下で構成することもできますがpytest
、カスタムのライブロギング形式を提供する場合は、構成するように誘惑されないでください。読み取りの他のツールは、文字列補間のようなものを扱い、失敗する可能性があります。とにかく使用するのが最善の選択ですが、従来のiniスタイル形式を使用せざるを得ない場合は、エラーを回避するために固執してください。setup.cfg
[tool:pytest]
setup.cfg
%(message)s
pyproject.toml
pytest.ini