Chciałbym umieścić kilka instrukcji logowania w funkcji testowej, aby zbadać niektóre zmienne stanu.
Mam następujący fragment kodu:
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 ')
Otrzymuję następujący wynik:
[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
Zauważ, że tylko komunikaty logowania z '__name__ == __main__'
bloku są przesyłane do konsoli.
Czy istnieje sposób, aby wymusić pytest
emitowanie logowania do konsoli również z metod testowych?
Odpowiedzi:
U mnie działa, oto wynik, który otrzymuję: [wycinek -> przykład był nieprawidłowy]
Edycja: Wygląda na to, że musisz przekazać tę
-s
opcję do py.test, aby nie przechwytywał standardowego wyjścia. Tutaj (py.test nie jest zainstalowany) wystarczyło użyćpython pytest.py -s pyt.py
.Na kodzie, co potrzebne jest do przekazywania
-s
wargs
celumain
:pytest.main(args=['-s', os.path.abspath(__file__)])
Zobacz dokumentację py.test dotyczącą przechwytywania danych wyjściowych .
źródło
logging.basicConfig(filename="somelog.txt", level=logging.DEBUG)
.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ć, ustawlog_cli = 1
wpytest.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 :
Jak zauważył Kévin Barré w tym komentarzu , nadpisywanie opcji ini z wiersza poleceń można wykonać za pomocą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.-o/--override
opcji. Więc zamiast deklarowaćlog_cli
wpytest.ini
, możesz po prostu zadzwonić:Przykłady
Prosty plik testowy używany do demonstracji:
# 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
Jak widać, nie jest wymagana żadna dodatkowa konfiguracja;
pytest
ustawi rejestrator automatycznie, na podstawie opcji określonych wpytest.ini
linii poleceń lub przekazanych z niej.Rejestrowanie na żywo do terminala,
INFO
poziomu, fantazyjnego wyjściaKonfiguracja 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 wpytest.log
plikuKonfiguracja 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
wsetup.cfg
tej[tool:pytest]
sekcji, nie ulegaj pokusie, aby to zrobić, jeśli chcesz zapewnić niestandardowy format rejestrowania na żywo. Inne narzędzia do odczytusetup.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.źródło
log_cli
musi znajdować się w pytest.ini , wygląda na to, że można użyć-o
opcji nadpisania wartości z wiersza poleceń.pytest -o log_cli=true --log-cli-level=DEBUG
pracuje dla mnie.pytest
nieco ograniczony w tej kwestii. Jednak powinno to być możliwe przy użyciu specjalnej konfiguracji rejestrowania testów w Twojej aplikacji; wyłącz propagację w swoich rejestratorach i dodaj „moduł obsługi testów”, który loguje się do określonego pliku. W ten sposóbpytest
rejestruje tylko rekordy pochodzące z testów, podczas gdy niestandardowa obsługa zajmuje się dziennikami SuT.pytest
dane wyjściowe, możesz użyć--result-log
argumentu (chociaż zauważ, że jest on przestarzały, tutaj są alternatywy ). Nie możesz jednak przechowywaćpytest
danych wyjściowych i danych wyjściowych rejestrowania na żywo w tym samym pliku.