Ich möchte einige Protokollierungsanweisungen in die Testfunktion einfügen, um einige Statusvariablen zu untersuchen.
Ich habe das folgende Code-Snippet:
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 ')
Ich erhalte 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 Protokollierungsnachrichten vom '__name__ == __main__'
Block an die Konsole übertragen werden.
Gibt es eine Möglichkeit, pytest
die Protokollierung auch von Testmethoden an die Konsole zu erzwingen ?
Antworten:
Funktioniert für mich, hier ist die Ausgabe, die ich bekomme: [snip -> Beispiel war falsch]
Bearbeiten: Es scheint, dass Sie die
-s
Option an py.test übergeben müssen, damit stdout nicht erfasst wird. Hier (py.test nicht installiert) war es ausreichend zu verwendenpython pytest.py -s pyt.py
.Für Ihren Code, alles , was Sie brauchen , ist zu passieren
-s
inargs
anmain
:pytest.main(args=['-s', os.path.abspath(__file__)])
Weitere Informationen zum Erfassen der Ausgabe finden Sie in der Dokumentation zu py.test .
quelle
logging.basicConfig(filename="somelog.txt", level=logging.DEBUG)
.Seit Version 3.3 wird
pytest
die Live-Protokollierung unterstützt. Dies bedeutet, dass alle in Tests ausgegebenen Protokolldatensätze sofort auf dem Terminal gedruckt werden. Die Funktion ist im Abschnitt Live-Protokolle dokumentiert . Die Live-Protokollierung ist standardmäßig deaktiviert. Um es zu aktivieren, stellen Sielog_cli = 1
in derpyproject.toml
1 oderpytest.ini
2 Konfiguration ein. Die Live-Protokollierung unterstützt das Senden an Terminal und Datei. Die entsprechenden Optionen ermöglichen das Anpassen von Datensätzen:Terminal:
log_cli_level
log_cli_format
log_cli_date_format
Datei:
log_file
log_file_level
log_file_format
log_file_date_format
Hinweis : Das
Wie Kévin Barré in diesem Kommentar hervorhob, kann das Überschreiben von INI-Optionen über die Befehlszeile über dielog_cli
Flag kann nicht über die Befehlszeile übergeben werden und muss gesetzt seinpytest.ini
. Alle anderen Optionen können sowohl über die Befehlszeile übergeben als auch in der Konfigurationsdatei festgelegt werden.-o/--override
Option erfolgen. Anstatt also zu erklärenlog_cli
inpytest.ini
, können Sie einfach anrufen:Beispiele
Einfache Testdatei zur Demonstration:
# 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
Wie Sie sehen, ist keine zusätzliche Konfiguration erforderlich.
pytest
Der Logger wird automatisch eingerichtet, basierend auf den Optionen, die in derpytest.ini
Befehlszeile angegeben oder von dieser übergeben werden.Live-Protokollierung auf Terminal,
INFO
Ebene, ausgefallene AusgabeKonfiguration in
pyproject.toml
:[tool.pytest.ini_options] log_cli = true 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"
Die identische Konfiguration im Legacy
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
Ausführen des Tests:
$ 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 =============================
Live-Protokollierung in Terminal und Datei, nur Nachricht und
CRITICAL
Ebene im Terminal, ausgefallene Ausgabe inpytest.log
DateiKonfiguration in
pyproject.toml
:[tool.pytest.ini_options] log_cli = true 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"
Die identische Konfiguration im Legacy
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
Testlauf:
$ 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
pyproject.toml
wird seit Version 6.0 unterstützt und ist die beste Option IMO. Siehe PEP 518 für die technischen Daten.2 Obwohl Sie auch
pytest
insetup.cfg
diesem[tool:pytest]
Abschnitt konfigurieren können , sollten Sie dies nicht tun, wenn Sie ein benutzerdefiniertes Live-Protokollierungsformat bereitstellen möchten. Das Lesen anderer Toolssetup.cfg
behandelt möglicherweise Dinge wie%(message)s
String-Interpolation und schlägt fehl. Die beste Wahl istpyproject.toml
ohnehin die Verwendung. Wenn Sie jedoch gezwungen sind, das alte Ini-Format zu verwenden, halten Sie sich anpytest.ini
, um Fehler zu vermeiden.quelle
log_cli
In Bezug auf den Hinweis, der in pytest.ini enthalten sein muss , können Sie anscheinend die-o
Option verwenden, um den Wert in der Befehlszeile zu überschreiben.pytest -o log_cli=true --log-cli-level=DEBUG
funktioniert bei mir.pytest
ist in dieser Angelegenheit leider etwas eingeschränkt. Dies sollte jedoch mit einer speziellen Protokollierungskonfiguration für Tests in Ihrer App möglich sein. Deaktivieren Sie die Weitergabe in Ihren Loggern und fügen Sie einen "Testhandler" hinzu, der sich in einer angegebenen Datei protokolliert. Auf diese Weise werdenpytest
nur Datensätze protokolliert, die aus Tests stammen, während der benutzerdefinierte Handler sich um die SuT-Protokolle kümmert.pytest
Ausgabe speichern möchten , können Sie das--result-log
Argument verwenden (obwohl es veraltet ist, sind hier die Alternativen ). Sie können diepytest
Ausgabe und die Live-Protokollierungsausgabe jedoch nicht in derselben Datei speichern.