如何解决任何级别的日志记录都可以使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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。