Depuis la version 3.3, pytest
prend en charge la journalisation en direct, ce qui signifie que tous les enregistrements de journal émis lors des tests seront immédiatement imprimés sur le terminal. La fonctionnalité est documentée dans la section Live Logs . La journalisation en direct est désactivée par défaut; pour l'activer, définissez-le log_cli = 1
dans la pytest.ini
configuration 1 . La journalisation en direct prend en charge l'émission vers le terminal et le fichier; les options appropriées permettent la personnalisation des enregistrements:
Terminal:
log_cli_level
log_cli_format
log_cli_date_format
fichier:
log_file
log_file_level
log_file_format
log_file_date_format
Remarque : l' log_cli
indicateur ne peut pas être passé depuis la ligne de commande et doit être défini dans pytest.ini
. Toutes les autres options peuvent être à la fois passées à partir de la ligne de commande ou définies dans le fichier de configuration. Comme l'a souligné Kévin Barré dans ce commentaire , le remplacement des options ini à partir de la ligne de commande peut se faire via l' -o/--override
option. Ainsi, au lieu de déclarer log_cli
in pytest.ini
, vous pouvez simplement appeler:
$ pytest -o log_cli=true ...
Exemples
Fichier de test simple utilisé pour démontrer:
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
Comme vous pouvez le voir, aucune configuration supplémentaire n'est nécessaire; pytest
configurera l'enregistreur automatiquement, en fonction des options spécifiées pytest.ini
ou transmises depuis la ligne de commande.
Journalisation en direct vers le terminal, le INFO
niveau, la sortie fantaisie
Configuration en 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
Exécution du test:
$ 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 =============================
Connexion en direct au terminal et au fichier, uniquement message et CRITICAL
niveau dans le terminal, sortie fantaisie dans le pytest.log
fichier
Configuration en 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
Essai:
$ 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 Bien que vous puissiez configurer pytest
dans setup.cfg
sous la [tool:pytest]
section, ne soyez pas tenté de le faire lorsque vous souhaitez fournir un format de journalisation en direct personnalisé. D'autres outils de lecture setup.cfg
peuvent traiter des choses comme %(message)s
une interpolation de chaîne et échouer. Utilisez pytest.ini
pour éviter les erreurs.