Desde la versión 3.3, pytest
admite el registro en vivo, lo que significa que todos los registros emitidos en las pruebas se imprimirán en el terminal de inmediato. La función está documentada en la sección Registros en vivo . El registro en vivo está deshabilitado de forma predeterminada; para habilitarlo, configúrelo log_cli = 1
en la pytest.ini
configuración 1 . El registro en vivo admite la emisión a la terminal y al archivo; las opciones relevantes permiten la personalización de registros:
terminal:
log_cli_level
log_cli_format
log_cli_date_format
archivo:
log_file
log_file_level
log_file_format
log_file_date_format
Nota : la log_cli
bandera no se puede pasar desde la línea de comando y debe estar configurada pytest.ini
. Todas las demás opciones pueden pasarse desde la línea de comandos o configurarse en el archivo de configuración. Como señaló Kévin Barré en este comentario , se pueden anular las opciones ini desde la línea de comandos a través de la -o/--override
opción. Así que en lugar de declarar log_cli
en pytest.ini
, sólo tiene que llamar:
$ pytest -o log_cli=true ...
Ejemplos
Archivo de prueba simple utilizado para demostrar:
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
Como puede ver, no se necesita configuración adicional; pytest
configurará el registrador automáticamente, según las opciones especificadas pytest.ini
o pasadas desde la línea de comandos.
Registro en vivo a terminal, INFO
nivel, salida elegante
Configuración 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
Ejecutando la prueba:
$ 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 =============================
Registro en vivo en terminal y archivo, solo mensaje y CRITICAL
nivel en terminal, salida elegante en pytest.log
archivo
Configuración 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
Prueba de funcionamiento:
$ 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 Aunque puede configurarlo pytest
en setup.cfg
la [tool:pytest]
sección, no se sienta tentado a hacerlo cuando desee proporcionar un formato de registro en vivo personalizado. Otras herramientas de lectura setup.cfg
pueden tratar cosas %(message)s
como una interpolación de cadenas y fallar. Úselo pytest.ini
para evitar errores.