簡體   English   中英

使用 pytest.ini 進行日志記錄。 如何將append轉文件?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM