【问题标题】:Override python logging for test efficiency覆盖 python 日志记录以提高测试效率
【发布时间】:2011-08-24 08:04:13
【问题描述】:

在许多情况下,使用 python 的 logging 包会显着减慢单元测试的速度。假设日志记录对测试不是必需的,那么您将如何干净地覆盖每个测试的 logging,以便有效地跳过日志命令。

假设使用多个记录器如:

logger1 = logging.getLogger('logger1')
logger2 = logging.getLogger('logger2')

【问题讨论】:

    标签: python performance unit-testing logging


    【解决方案1】:

    选项 1:

    日志可以通过调用disabled

    logging.disable(logging.CRITICAL)
    

    然后重新打开

    logging.disable(logging.NOTSET)
    

    但是,即使在禁用日志记录之后,logger.info 之类的日志记录语句仍会导致 Python 在到达 isEnabledFor 方法之前执行一些属性查找和函数调用。不过,这可能已经足够了。

    选项 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 想要禁用所有日志记录,而不仅仅是较低级别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2019-04-08
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    相关资源
    最近更新 更多