2016-08-30 14 views
2

logbookをPyTestテストでセットアップして、stderrとファイルの両方にすべてを出力しようとしています。ファイルはすべてのログレベルを取得する必要がありますが、stderrのしきい値は高くなります(通常のキャプチャ設定でPyTestが管理します)。pytest logbookがファイルと標準出力にログする

私はpytest-logbookプラグインを持っています。それはstderrをPyTestのキャプチャにリダイレクトしますが、ファイル出力を追加する方法がわかりません。

これは(うまくいけば)ログブックを知っている人には分かりやすいですが、それは私には新しかったです。

さらにもう1つ、ファイルのログ記録をリアルタイムにしたい。私のテストは一般的に長時間実行されており、PyTestの正常な動作は失敗時の出力を表示するだけで、何かがハングアップしているかどうかを確認する必要はありません。

ここでは動作するはずのコードですが、そうではありません。私は(も、上の失敗)stdout/stderrにログファイルが、何を得る:

conftest.py

import os 
import pytest 
import logbook 
import sys 

@pytest.fixture(scope='module') 
def modlog(request): 
    """Logger that also writes to a file.""" 
    name = request.module.__name__ 
    if name.startswith('test_'): 
     name = name[5:] 
    logname = 'TEST-'+name+'.log' 
    if os.path.exists(logname): 
     os.rename(logname, logname+"~") 
    logger = logbook.Logger(name) 
    logger.handlers.append(logbook.FileHandler(logname, level='DEBUG')) 
    logger.handlers.append(logbook.StreamHandler(sys.stdout, level='INFO')) 
    logger.warn("Start of logging") 
    return logger 

test_loggy.py

import pytest 

def test_foo(modlog): 
    modlog.info('hello') 
    modlog.info('world') 
    assert 0      # logs will only print on test fail 

答えて

3

に自分の質問(ケース内の他の実行に答えます同じこと)。

ロギングハンドラはスタックを形成し、メッセージを「バブル」させる必要があります。これは、ハンドラが作成されるときにオプションとして行われます。

ので、ハンドラを作成する必要があります:

logger.handlers.append(logbook.FileHandler(logname, level='DEBUG', bubble=True)) 
logger.handlers.append(logbook.StreamHandler(sys.stderr, level='INFO', bubble=True)) 

あなたがpy.test -sを実行する場合は、あなたがリアルタイムで情報レベルのメッセージが表示されます。テストが失敗すると、失敗したテスト(デバッグを含む)に関するすべてのログメッセージがログブックプラグインに表示されます。また、ファイル内に(リアルタイムで)コピーを取得します。

関連する問題