Desde a versão 3.3, pytest
suporta registro ao vivo, o que significa que todos os registros de log emitidos nos testes serão impressos no terminal imediatamente. O recurso está documentado na seção Live Logs . O registro ao vivo é desabilitado por padrão; para habilitá-lo, defina log_cli = 1
na configuração pyproject.toml
1 ou pytest.ini
2 . O registro ao vivo suporta a emissão para o terminal e arquivo; as opções relevantes permitem a personalização de registros:
terminal:
log_cli_level
log_cli_format
log_cli_date_format
Arquivo:
log_file
log_file_level
log_file_format
log_file_date_format
Nota : a log_cli
bandeira não pode ser passada da linha de comando e deve ser definida em pytest.ini
. Todas as outras opções podem ser passadas da linha de comando ou definidas no arquivo de configuração. Como apontado por Kévin Barré em este comentário , substituindo opções ini de linha de comando pode ser feito através da -o/--override
opção. Então, ao invés de declarar log_cli
em pytest.ini
, você pode simplesmente chamar:
$ pytest -o log_cli=true ...
Exemplos
Arquivo de teste simples usado para demonstrar:
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 você pode ver, nenhuma configuração extra é necessária; pytest
irá configurar o logger automaticamente, com base nas opções especificadas pytest.ini
ou transmitidas na linha de comando.
Registro ao vivo para terminal, INFO
nível, saída extravagante
Configuração em 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"
A configuração idêntica no legado 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
Executando o teste:
$ 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 ao vivo no terminal e arquivo, apenas mensagem e CRITICAL
nível no terminal, saída extravagante no pytest.log
arquivo
Configuração em 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"
A configuração idêntica no legado 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
Execução de teste:
$ 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
suportado desde a versão 6.0 e é a melhor opção IMO. Consulte PEP 518 para obter as especificações.
2 Embora você também possa configurar pytest
em setup.cfg
na [tool:pytest]
seção, não fique tentado a fazer isso quando quiser fornecer um formato de registro ao vivo personalizado. Outras ferramentas de leitura setup.cfg
podem tratar coisas como %(message)s
interpolação de string e falhar. A melhor escolha é usar pyproject.toml
mesmo assim, mas se você for forçado a usar o formato legado do estilo ini, atenha-se a pytest.ini
para evitar erros.