Sejak versi 3.3, pytestmendukung 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 = 1di pytest.inikonfigurasi 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_clibendera 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/--overrideopsi tersebut. Jadi, alih-alih mendeklarasikan log_climasuk 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; pytestakan mengatur logger secara otomatis, berdasarkan opsi yang ditentukan pytest.iniatau diteruskan dari baris perintah.
Live logging ke terminal, INFOlevel, 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 & CRITICALlevel di terminal, keluaran mewah dalam pytest.logfile
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 pytestdi setup.cfgbawah [tool:pytest]bagian ini, jangan tergoda untuk melakukannya saat Anda ingin menyediakan format logging langsung kustom. Alat lain yang membaca setup.cfgmungkin memperlakukan hal-hal seperti %(message)sinterpolasi string dan gagal. Gunakan pytest.iniuntuk menghindari kesalahan.