Od wersji 3.3 pytest
obsługuje rejestrowanie na żywo, co oznacza, że wszystkie rekordy dziennika wysyłane podczas testów zostaną natychmiast wydrukowane na terminalu. Funkcja jest udokumentowana w sekcji Dzienniki na żywo . Rejestrowanie na żywo jest domyślnie wyłączone; aby go włączyć, ustaw log_cli = 1
w pytest.ini
config 1 . Rejestrowanie na żywo obsługuje wysyłanie do terminala i pliku; odpowiednie opcje umożliwiają dostosowanie rekordów:
terminal:
log_cli_level
log_cli_format
log_cli_date_format
plik:
log_file
log_file_level
log_file_format
log_file_date_format
Uwaga : log_cli
flagi nie można przekazać z wiersza poleceń i należy ją ustawić pytest.ini
. Wszystkie inne opcje można przekazać z wiersza poleceń lub ustawić w pliku konfiguracyjnym. Jak zauważył Kévin Barré w tym komentarzu , nadpisywanie opcji ini z wiersza poleceń można wykonać za pomocą -o/--override
opcji. Więc zamiast deklarować log_cli
w pytest.ini
, możesz po prostu zadzwonić:
$ pytest -o log_cli=true ...
Przykłady
Prosty plik testowy używany do demonstracji:
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
Jak widać, nie jest wymagana żadna dodatkowa konfiguracja; pytest
ustawi rejestrator automatycznie, na podstawie opcji określonych w pytest.ini
linii poleceń lub przekazanych z niej.
Rejestrowanie na żywo do terminala, INFO
poziomu, fantazyjnego wyjścia
Konfiguracja w 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
Uruchomienie testu:
$ 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 =============================
Rejestrowanie na żywo do terminala i pliku, tylko komunikat i CRITICAL
poziom w terminalu, fantazyjne wyjście w pytest.log
pliku
Konfiguracja w 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
Testowe uruchomienie:
$ 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 Chociaż możesz skonfigurować pytest
w setup.cfg
tej [tool:pytest]
sekcji, nie ulegaj pokusie, aby to zrobić, jeśli chcesz zapewnić niestandardowy format rejestrowania na żywo. Inne narzędzia do odczytu setup.cfg
mogą traktować takie rzeczy jak %(message)s
interpolacja ciągów i kończyć się niepowodzeniem. Użyj, pytest.ini
aby uniknąć błędów.