python - 使用 pytest.ini 进行日志记录。如何附加到文件?
问题描述
我正在尝试将日志记录添加到我的 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
文档:
此日志文件以写入模式打开,这意味着它将在每次运行测试会话时被覆盖。
这意味着您不能通过配置强制执行附加模式;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
和强制附加模式。因此,我建议不要这样做。
推荐阅读
- mysql - Sum 列,在满足某个值时进行不同的计数
- python - Python Tkinter 按钮无效语法错误
- kubernetes - k8s - Pod 重启时间
- haskell - 将字符串列表解析为 Int
- stream - 更正流数据中的聚合视图
- sql - 取消率最高的输出月份
- node.js - 是否有任何可靠的指标表明 Clojure 或 Node.js 是构建 Web api 的更好工具?
- javascript - Node.Js API 等待 dynamodb 调用完成发送到浏览器
- laravel - 404 在生产中导航到 laravel 中的获取路线时
- python - 在命令行中将多个 xml 文件一起添加