[英]Logging with pytest.ini. How to append to the file?
我正在嘗試將日志記錄添加到我的 pytest 測試中,一切都很好,除了每個其他測試運行的日志都會重新寫入所有寶貴的信息。
這是我的 pytest.ini 文件:
log_file = my.log
log_file_level = DEBUG
log_file_format = %(levelname)s %(asctime)s - %(message)s (%(filename)s:%(lineno)s)
log_file_date_format=%Y-%m-%d %H:%M:%S
這是我的測試代碼:
import os
class TestLog:
def test_log_1(self):
logging.info('everything is okay')
output = 2
assert output == 2, 'everything is okay'
def test_log_2(self):
output = 0
logging.info(f'test params: {output}')
try:
assert output == 2, 'everything is okay'
except AssertionError:
logging.error(f"'everything is not okay'")
raise AssertionError
我試圖添加logging.basicConfig(filemode = "a")
但它沒有幫助。
任何幫助,將不勝感激
引用pytest
文檔:
此日志文件以寫入模式打開,這意味着它將在每次運行測試 session 時被覆蓋。
這意味着您不能通過配置強制執行 append 模式; logging.basicConfig
在這里也無濟於事,因為它在調用太晚時是一個 noop,或者它確實配置了日志記錄,但后來pytest
仍然會忽略它並設置自己的處理程序。
我看到的唯一選擇是通過將新日志與前一個日志合並來管理自己的附加。 在啟動時備份my.log
,在退出前將其與新的my.log
合並。 將代碼放在項目中的文件conftest.py
或測試根目錄中:
import io
import pathlib
import os
import shutil
def pytest_configure(config):
log_file = config.rootpath / config.getini("log_file")
if log_file.is_file():
config._backup = log_file.with_name(".log.bak")
shutil.copy(log_file, config._backup)
@pytest.hookimpl(trylast=True)
def pytest_unconfigure(config):
log_file = config.rootpath / config.getini("log_file")
if log_file.is_file():
log_backup = getattr(config, "_backup", None)
if log_backup and log_backup.is_file():
log_file.write_text(log_backup.read_text() + log_file.read_text())
log_backup.unlink()
另一種選擇可能是搞亂pytest
內部結構,但由於該模式是硬編碼的,因此實現會相當難看,例如猴子_pytest.logging._FileHandler
並強制執行 append 模式。 因此,我建議不要這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.