テスト関数内にいくつかのロギングステートメントを配置して、いくつかの状態変数を調べたいと思います。
次のコードスニペットがあります。
import pytest,os
import logging
logging.basicConfig(level=logging.DEBUG)
mylogger = logging.getLogger()
#############################################################################
def setup_module(module):
''' Setup for the entire module '''
mylogger.info('Inside Setup')
# Do the actual setup stuff here
pass
def setup_function(func):
''' Setup for test functions '''
if func == test_one:
mylogger.info(' Hurray !!')
def test_one():
''' Test One '''
mylogger.info('Inside Test 1')
#assert 0 == 1
pass
def test_two():
''' Test Two '''
mylogger.info('Inside Test 2')
pass
if __== '__main__':
mylogger.info(' About to start the tests ')
pytest.main(args=[os.path.abspath(__file__)])
mylogger.info(' Done executing the tests ')
次の出力が得られます。
[bmaryada-mbp:/Users/bmaryada/dev/platform/main/proto/tests/tpch $]python minitest.py
INFO:root: About to start the tests
======================================================== test session starts =========================================================
platform darwin -- Python 2.6.2 -- pytest-2.0.0
collected 2 items
minitest.py ..
====================================================== 2 passed in 0.01 seconds ======================================================
INFO:root: Done executing the tests
'__== __main__'
ブロックからのログメッセージのみがコンソールに送信されることに注意してください。
Pytestにテストメソッドからログをコンソールに強制的に出力させる方法はありますか?
私のために働く、ここに私が得る出力があります:[snip-> example was wrong
編集:-s
オプションをpy.testに渡して、stdoutをキャプチャしないようにする必要があるようです。ここでは(py.testはインストールされていません)、python pytest.py -s pyt.py
を使用するだけで十分です。
コードに必要なのは、args
の-s
をmain
に渡すことだけです。
pytest.main(args=['-s', os.path.abspath(__file__)])
出力のキャプチャ のpy.testドキュメントを参照してください。
バージョン3.3以降、pytest
はライブロギングをサポートします。つまり、テストで出力されたすべてのログレコードは、すぐに端末に出力されます。この機能は Live Logs セクションに記載されています。ライブロギングはデフォルトで無効になっています。有効にするには、_log_cli = 1
_設定で_pytest.ini
_を設定します1。ライブロギングは、端末およびファイルへの送信をサポートしています。関連するオプションにより、レコードをカスタマイズできます。
log_cli_level
_log_cli_format
_log_cli_date_format
_log_file
_log_file_level
_log_file_format
_log_file_date_format
_注: _ KévinBarré in this comment で指摘されているように、コマンドラインからのiniオプションのオーバーライドは_log_cli
_フラグはコマンドラインから渡すことができず、mustを_pytest.ini
_に設定する必要があります。他のすべてのオプションは、両方ともコマンドラインから渡すか、設定ファイルで設定できます。-o/--override
_オプションを介して実行できます。したがって、_log_cli
_で_pytest.ini
_を宣言する代わりに、単に呼び出すことができます。
_$ pytest -o log_cli=true ...
_
デモンストレーションに使用される単純なテストファイル:
_# test_spam.py
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
レベル、ファンシー出力_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
_ファイルの空想的な出力_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 _setup.cfg
_セクションの下の_[tool:pytest]
_でpytest
を構成できますが、カスタムのライブロギング形式を提供する場合は、そうしないでください。 _setup.cfg
_を読み取る他のツールは、%(message)s
のようなものを文字列補間として扱い、失敗する可能性があります。エラーを回避するには、_pytest.ini
_を使用します。