web-dev-qa-db-ja.com

py.testテスト内のログ

テスト関数内にいくつかのロギングステートメントを配置して、いくつかの状態変数を調べたいと思います。

次のコードスニペットがあります。

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にテストメソッドからログをコンソールに強制的に出力させる方法はありますか?

60
superselector

私のために働く、ここに私が得る出力があります:[snip-> example was wrong

編集:-sオプションをpy.testに渡して、stdoutをキャプチャしないようにする必要があるようです。ここでは(py.testはインストールされていません)、python pytest.py -s pyt.pyを使用するだけで十分です。

コードに必要なのは、args-smainに渡すことだけです。

 pytest.main(args=['-s', os.path.abspath(__file__)])

出力のキャプチャ のpy.testドキュメントを参照してください。

26
TryPyPy

バージョン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_

: _log_cli_フラグはコマンドラインから渡すことができず、mustを_pytest.ini_に設定する必要があります。他のすべてのオプションは、両方ともコマンドラインから渡すか、設定ファイルで設定できます。 KévinBarré in this comment で指摘されているように、コマンドラインからの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_を使用します。

52
hoefling