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 Sie log_cli = 1
in der pyproject.toml
1 oder pytest.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 log_cli
Flag kann nicht über die Befehlszeile übergeben werden und muss gesetzt sein pytest.ini
. Alle anderen Optionen können sowohl über die Befehlszeile übergeben als auch in der Konfigurationsdatei festgelegt werden. Wie Kévin Barré in diesem Kommentar hervorhob, kann das Überschreiben von INI-Optionen über die Befehlszeile über die -o/--override
Option erfolgen. Anstatt also zu erklären log_cli
in pytest.ini
, können Sie einfach anrufen:
$ pytest -o log_cli=true ...
Beispiele
Einfache Testdatei zur Demonstration:
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 der pytest.ini
Befehlszeile angegeben oder von dieser übergeben werden.
Live-Protokollierung auf Terminal, INFO
Ebene, ausgefallene Ausgabe
Konfiguration 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 in pytest.log
Datei
Konfiguration 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
in setup.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 Tools setup.cfg
behandelt möglicherweise Dinge wie %(message)s
String-Interpolation und schlägt fehl. Die beste Wahl ist pyproject.toml
ohnehin die Verwendung. Wenn Sie jedoch gezwungen sind, das alte Ini-Format zu verwenden, halten Sie sich an pytest.ini
, um Fehler zu vermeiden.