python logging py.test

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 .