覆盖Python日志以提高测试效率

5
在很多情况下,使用Python的logging模块会严重拖慢单元测试的速度。假设在测试中不需要使用logging模块,那么你该如何干净地覆盖每个测试中的logging模块,以便log命令被有效地跳过。
假设有多个logger,如下所示:
logger1 = logging.getLogger('logger1')
logger2 = logging.getLogger('logger2')
1个回答

12

选项1:

可以通过调用logging.disable来禁用日志记录。

logging.disable(logging.CRITICAL)

并重新打开

logging.disable(logging.NOTSET)

即使禁用了日志记录,像logger.info这样的日志记录语句在到达isEnabledFor方法之前仍会导致Python进行一些属性查找和函数调用。尽管如此,这可能已经足够。

选项2:

使用模拟:

class MockLogger(object):
    def debug(msg, *args, **kwargs): pass
    def info(msg, *args, **kwargs): pass
    def warn(msg, *args, **kwargs): pass
    def error(msg, *args, **kwargs): pass
    def critical(msg, *args, **kwargs): pass

class Test(unittest.TestCase):
    def test_func(self):
        _logger1=testmodule.logger1
        _logger2=testmodule.logger2
        testmodule.logger1=MockLogger()
        testmodule.logger2=MockLogger()
        # perform test
        testmodule.logger1=_logger1
        testmodule.logger2=_logger2

这样将会将日志记录语句的消耗时间减少到一个属性查找和一个(noop)函数调用所需的时间。如果这还不令人满意,我认为唯一剩下的选择是删除日志记录语句本身。


应该是 logging.disable(logging.FATAL),因为 OP 想要禁用所有日志记录,而不仅仅是较低级别的日志。 - Dima Tisnek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接