Переопределить ведение журнала Python для эффективности теста - PullRequest
5 голосов
/ 24 августа 2011

Во многих случаях юнит-тесты значительно замедляются использованием пакета logging в python. Предполагая, что ведение журнала не является обязательным для теста, как бы вы аккуратно переопределили logging для каждого теста, чтобы команды журнала были эффективно пропущены.

Предполагается использование нескольких регистраторов, таких как:

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

1 Ответ

12 голосов
/ 24 августа 2011

Вариант 1:

Ведение журнала может быть отключено путем вызова

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) вызова функции. Если это неудовлетворительно, я думаю, что единственный оставшийся вариант - это удалить сами операторы регистрации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...