2011-01-12 9 views
29

Ich möchte einige Protokollanweisungen innerhalb der Testfunktion setzen, um einige Zustandsvariablen zu untersuchen.Logging in py.test Tests

Ich habe den folgenden Code-Schnipsel:

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 __name__ == '__main__': 
    mylogger.info(' About to start the tests ') 

    pytest.main(args=[os.path.abspath(__file__)]) 

    mylogger.info(' Done executing the tests ') 

bekomme ich folgende Ausgabe:

[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 

Beachten Sie, dass nur die Log-Meldungen aus dem '__name__ == __main__' Block an die Konsole übertragen bekommen.

Gibt es eine Möglichkeit, zu erzwingen, dass PYTEST auch von Testmethoden zur Protokollierung in die Konsole emittiert?

+2

Sie können sich [diese Antwort] (http://stackoverflow.com/a/11877951/148680) ansehen, gepostet von py.test's Creator. Er schlägt ein Pytest-Plugin vor, das ein hohes Maß an Vielseitigkeit bietet. – chb

Antwort

17

Works für mich, hier ist der Ausgang I erhalten: [snip -> Beispiel war falsch]

Edit: Es scheint, dass Sie die Option -s passieren müssen py.test so wird es nicht stdout erfassen. Hier (py.test nicht installiert) reichte es, python pytest.py -s pyt.py zu verwenden.

für Ihren Code, alles, was Sie brauchen, ist -s in args-main weitergeben müssen:

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

Siehe py.test Dokumentation auf capturing output.

+0

Entschuldigung. Ich habe den Code in Eile eingefügt. Bitte entfernen Sie 'assert 0 == 1' von der Funktion 'test_one', um das 'Problem' zu bemerken. Nur wenn es einen Fehler gibt (den ich durch eine falsche Assertion erzwingen musste), scheint py.test die Protokollierungsinformationen zu drucken. – superselector

+0

Kein Problem, ich habe herausgefunden, wie man in der Befehlszeile nach einem programmatischen Weg sucht. – TryPyPy

+1

Sie könnten auch die Logging-Ausgabe in eine Datei umleiten anstelle des standardmäßigen impliziten stderr. – hpk42