2016-08-30 6 views
2

Ich versuche logbook in einem PyTest-Test einzurichten, um sowohl stderr als auch eine Datei auszugeben. Die Datei sollte jede Protokollstufe erhalten, aber stderr sollte einen höheren Schwellenwert haben (den PyTest mit seinen üblichen Aufnahmeeinstellungen verwalten wird).pytest logbook Logging in Datei und stdout

Ich habe das pytest-logbook Plugin. Das leitet stderr in PyTest-Capture um, aber ich bin nicht sicher, wie die Dateiausgabe hinzugefügt wird.

Dies ist (hoffentlich) offensichtlich für jemanden, der Logbuch kennt, aber es ist neu für mich.

Noch eine Sache, ich möchte die Dateiprotokollierung in Echtzeit sein. Meine Tests laufen in der Regel lange, und das normale Verhalten von PyTest, bei dem nur die Ausgabe nach einem Fehler angezeigt wird, hilft nicht, wenn ich sehen muss, ob die Dinge hängen bleiben.

Hier ist Code, der meiner Meinung nach funktionieren sollte, aber nicht. Ich erhalte die Protokolldatei, aber nichts zu stdout/stderr (auch auf fail):

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 

Antwort

3

Beantwortung meiner Frage (bei anderen laufen in das gleiche).

Die Protokollierungshandler bilden einen Stapel und Sie müssen zulassen, dass Nachrichten durchgeblubbert werden. Dies geschieht als Option, wenn die Handler erstellt werden.

So sollte die Handler Schöpfung:

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

Wenn Sie py.test -s laufen, dann werden Sie die Info-Ebene Nachrichten in Echtzeit sehen. Wenn der Test fehlschlägt, zeigt das Logbuch-Plugin alle Protokollmeldungen für den fehlgeschlagenen Test (einschließlich Debugging) an. Sie erhalten auch eine Kopie in der Datei (in Echtzeit).