我正在使用日志(log)格式化程序来编辑密码.我想编写一个测试,以确认日志(log)编校程序是有效的.在本例中,我简化了代码以编辑"foo".

在My my_logger.py模块中使用此编校程序代码(特定单词的简化编校):

class RedactFoo:
    def __init__(self, base_formatter):
        self.base_formatter = base_formatter

    def format(self, record):
        msg = self.base_formatter.format(record)
        return msg.replace("foo", "<<REDACTED>>")

    def __getattr__(self, attr):
        return getattr(self.orig_formatter, attr)

然后配置我的记录器并包装每个处理程序的格式化程序:

logging.config.dictConfig(logging_config)

# Set the formatter on all handlers
for h in logging.root.handlers:
    h.setFormatter(RedactFoo(h.formatter))

def get_logger(name):
    return logging.getLogger(name)

如果我参选:

logger = my_logger.get_logger("Test")
logger.error(f"This message has foo.")

记录器会对消息进行编辑.

然而,在PYTEST test_my_logger.py中:

import my_logger

def test_logging_redactor(caplog):
    logger = my_logger.get_logger("test")
    logger.error(f"This message has foo.")
    assert ""This message has <<REDACTED>>." in caplog.text

此测试未通过,因为Pytest日志(log)记录配置覆盖了我的自定义配置.如何使用PYTEST和caplogfixture 来执行此测试?

我在这里看到了unittest的解决方案:How to test specific logging formatting in Python (using `pytest` and `unittest`),但我对用PYTEST做这个很感兴趣.

推荐答案

caplog装置的工作方式是将自己的LogCaptureHandler注入日志(log)框架配置.这就是它能够拦截日志(log)记录并提供caplog.textcaplog.recordscaplog.record_tuples等处的事件的方式,用户可以对这些事件进行断言.请注意,它正在捕获stdlib LogRecord实例,即the log events have not been rendered yet个实例,并且您的定制格式方法尚未被调用.

如果您还希望在测试期间对格式化文本进行密文编辑,则还必须将其应用于测试记录配置,即在输入caplog装置之后:

@pytest.fixture(autouse=True)
def redact_caplog_handlers(caplog):
    caplog.handler.setFormatter(RedactFoo(caplog.handler.formatter))

Python相关问答推荐

如何随着收件箱的增加动态添加到HTML表的右下角?

不同数据类型的Python成员变量不会在具有相同优先级的不同线程中更新

PyTorch卷积自动编码器,输出维度与输入不同

在后台运行的Python函数

如何在Python中按组应用简单的线性回归?

机器人与Pyton Minecraft服务器状态不和

在上下文管理器中更改异常类型

如何让 turtle 通过点击和拖动来绘制?

理解Python的二分库:澄清bisect_left的使用

Pandas 第二小值有条件

如何在箱形图中添加绘制线的传奇?

运行Python脚本时,用作命令行参数的SON文本

为什么带有dropna=False的groupby会阻止后续的MultiIndex.dropna()工作?

如何从具有不同len的列表字典中创建摘要表?

两个pandas的平均值按元素的结果串接元素.为什么?

Scrapy和Great Expectations(great_expectations)—不合作

用砂箱开发Web统计分析

为什么\b在这个正则表达式中不解释为反斜杠

跳过嵌套JSON中的级别并转换为Pandas Rame

为什么调用函数的值和次数不同,递归在代码中是如何工作的?