Sejak versi 3.3, pytest
mendukung live logging, yang berarti bahwa semua catatan log yang dikeluarkan dalam pengujian akan segera dicetak ke terminal. Fitur ini didokumentasikan di bawah bagian Live Logs . Live logging dinonaktifkan secara default; untuk mengaktifkannya, setel log_cli = 1
di pytest.ini
konfigurasi 1 . Live logging mendukung pemancaran ke terminal dan file; opsi yang relevan memungkinkan penyesuaian catatan:
terminal:
log_cli_level
log_cli_format
log_cli_date_format
mengajukan:
log_file
log_file_level
log_file_format
log_file_date_format
Catatan : log_cli
bendera tidak bisa dilewatkan dari baris perintah dan harus disetel masuk pytest.ini
. Semua opsi lain dapat diteruskan dari baris perintah atau disetel di file konfigurasi. Seperti yang ditunjukkan oleh Kévin Barré dalam komentar ini , menimpa opsi ini dari baris perintah dapat dilakukan melalui -o/--override
opsi tersebut. Jadi, alih-alih mendeklarasikan log_cli
masuk pytest.ini
, Anda cukup memanggil:
$ pytest -o log_cli=true ...
Contoh
File pengujian sederhana yang digunakan untuk mendemonstrasikan:
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
Seperti yang Anda lihat, tidak diperlukan konfigurasi tambahan; pytest
akan mengatur logger secara otomatis, berdasarkan opsi yang ditentukan pytest.ini
atau diteruskan dari baris perintah.
Live logging ke terminal, INFO
level, keluaran mewah
Konfigurasi di 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
Menjalankan tes:
$ 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 =============================
Live logging ke terminal dan file, hanya pesan & CRITICAL
level di terminal, keluaran mewah dalam pytest.log
file
Konfigurasi di 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
Uji coba:
$ 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 Meskipun Anda dapat mengonfigurasi pytest
di setup.cfg
bawah [tool:pytest]
bagian ini, jangan tergoda untuk melakukannya saat Anda ingin menyediakan format logging langsung kustom. Alat lain yang membaca setup.cfg
mungkin memperlakukan hal-hal seperti %(message)s
interpolasi string dan gagal. Gunakan pytest.ini
untuk menghindari kesalahan.