覆盖python日志记录以提高测试效率

时间:2011-08-24 08:04:13

标签: python performance unit-testing logging

在许多情况下,使用python的logging包显着降低了单元测试的速度。假设日志记录对测试不是必不可少的,那么如何干净地覆盖每次测试logging,以便有效地跳过日志命令。

假设使用多个记录器,例如:

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

1 个答案:

答案 0 :(得分:12)

选项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)函数调用所花费的时间所消耗的时间。如果这不令人满意,我认为唯一的选择是删除日志记录本身。