Jon*_*han 5 python performance logging unit-testing
在许多情况下,使用python的logging包显着减慢了单元测试.假设日志记录对测试不是必不可少的,那么如何干净地覆盖logging每次测试,以便有效地跳过日志命令.
假设使用多个记录器,例如:
logger1 = logging.getLogger('logger1')
logger2 = logging.getLogger('logger2')
Run Code Online (Sandbox Code Playgroud)
unu*_*tbu 12
选项1:
可以通过调用禁用日志记录
logging.disable(logging.CRITICAL)
Run Code Online (Sandbox Code Playgroud)
并重新开始
logging.disable(logging.NOTSET)
Run Code Online (Sandbox Code Playgroud)
但是,即使在禁用日志记录之后,日志记录语句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
Run Code Online (Sandbox Code Playgroud)
这将减少将语句记录到执行一次属性查找和一次(noop)函数调用所花费的时间所消耗的时间.如果这不令人满意,我认为剩下的唯一选择就是删除日志语句本身.