python - Inicio de sesión dentro de las pruebas de py.test
logging (2)
Me gustaría poner algunas declaraciones de registro dentro de la función de prueba para examinar algunas variables de estado.
Tengo el siguiente fragmento de código:
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 '')
Obtengo el siguiente resultado:
[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
Tenga en cuenta que solo los mensajes de registro del bloque ''__name__ == __main__''
se transmiten a la consola.
¿Hay alguna manera de forzar a Pytest a que emita también el registro de la consola desde los métodos de prueba?
Desde la versión 3.3, pytest
admite el registro en vivo, lo que significa que todos los registros de registro 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 por defecto; para habilitarlo, configure log_cli = 1
en la configuración de pytest.ini
. Live Logging admite emitir a terminal y 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 : el indicador log_cli
no se puede pasar desde la línea de comandos y debe establecerse en pytest.ini
(o setup.cfg
). Todas las otras opciones se pueden pasar de la línea de comando o establecer en el archivo de configuración.
Ejemplos
Archivo de prueba simple utilizado para demostrar:
# 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
Como puede ver, no se necesita configuración adicional; pytest
configurará el registrador automáticamente, en función de las opciones especificadas en pytest.ini
o pasadas desde la línea de comandos.
Registro en vivo al terminal, nivel INFO
, salida de lujo
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//bin/python3.6
cachedir: .pytest_cache
rootdir: /Users/hoefling/projects/private//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 =============================
pytest.log
en vivo a la terminal y archivo, solo mensaje y nivel CRITICAL
en terminal, salida elegante en el archivo pytest.log
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//bin/python3.6
cachedir: .pytest_cache
rootdir: /Users/hoefling/projects/private//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)
Funciona para mí, aquí está la salida que recibo: [snip -> example was incorrect]
Editar: parece que tienes que pasar la opción -s
a py.test para que no capture la salida estándar. Aquí (py.test no instalado), fue suficiente usar python pytest.py -s pyt.py
Para su código, todo lo que necesita es pasar -s
en args
a main
:
pytest.main(args=[''-s'', os.path.abspath(__file__)])
Consulte la documentación de py.test sobre la captura de resultados .