任何级别的日志记录都可以使assertLogs通过

问题描述

我正在尝试测试单元测试中是否记录了警告。似乎以下测试应该失败:

import logging
import unittest

LOG_FORMAT = '%(levelname)-10s %(asctime)s: %(message)s'


def set_up_logger(app_name,level=logging.INFO,file="test.log"):
    formatter = logging.Formatter(LOG_FORMAT)
    log = logging.getLogger(app_name)
    # The next line lets the test pass
    log.setLevel(level)
    return log

logger = set_up_logger(__name__)

class TestLogging(unittest.TestCase):
    def test_logging(self):
        with self.assertLogs(level=logging.WARNING):
            logger.info('foo')

但是,它与python 3.8.5一起传递。

如果我删除log.setLevel(level)行,则测试将失败,如预期的那样。如果我将logger.info行替换为pass,则测试也会按预期失败。

为什么在记录仪上设置级别会导致测试错误通过?

解决方法

我不太确定是否需要此行为,因为这有点意外。要修复测试,您必须通过记录器:

class TestLogging(unittest.TestCase):
    def test_logging(self):
        with self.assertLogs(logger,level=logging.WARNING):
            logger.info('foo')

以这种方式工作的原因是在assertLogs上下文管理器中,将通过的记录器的日志级别临时设置为通过的级别,并且如果退出时未发生任何日志记录,则测试将失败。

如果您通过记录器,则将使用根记录器。如果您未在记录器上设置级别,它将使用根记录器的级别,该记录器在调用过程中被上下文管理器设置为WARNING-因此将不会记录任何内容,并且测试将失败预期的。

如果要做设置日志级别,则无论root logger级别如何,都将使用此日志级别,因此将完成日志记录并通过测试(这不是我期望的,要么。)

更新:
现在有一个描述问题的Python issue,在主目录中为now fixed