2017-11-29 3 views
2

と呼ばれた後、なぜユニットテストでのPythonのロガーが動作していない私は私のunittest TestCaseクラスに次のコードを持っている:でsetLevelは

class StatsdLogHandler(logging.Handler): 
    def emit(self, record): 
     log_entry = self.format(record) 
     statsd_client.incr(log_entry) 

def setup_statsd_logging(logger, level=logging.WARNING): 
    # set up statsd counts for logging 
    statsd_format = "pegasus.logger.%(levelname)s.%(name)s" 
    formatter = logging.Formatter(statsd_format) 
    statsd_handler = StatsdLogHandler() 
    statsd_handler.setFormatter(formatter) 
    statsd_handler.setLevel(level) 
    logger.addHandler(statsd_handler) 

class TestLogging(unittest.TestCase): 
    @mock.patch('.statsd_client') 
    def test_logging_to_statsd(self, statsd_mock): 
     """Make sure log calls go to statsd""" 
     root_logger = logging.getLogger() 
     setup_statsd_logging(root_logger) 
     root_logger.setLevel(logging.DEBUG) 
     root_logger.warning('warning') 
     statsd_mock.incr.assert_called_with('pegasus.logger.WARNING.root') 

私はTestLoggingのテストケースを実行したときしかし、私は

AssertionError: Expected call: incr(u'pegasus.logger.WARNING.root')

Not called

を取得

この呼び出しが成功すると思います。なぜこうなった?

答えて

1

この現象をデバッグすると、という値に設定されています(WARNING以下のレベルのログはすべて出力されていないことがわかりました)。

ロギングManagerオブジェクトは、私が見つけやすい場所には記載されていませんが、ルートロガーを含むすべてのロガーを記述して格納するオブジェクトです。コードhereで定義されています。私が見つけたのは、テストケースのどこかでlogging.disable(logging.WARNING)への呼び出しがあったということでした。これにより、root_logger.manager.disableの値が30に設定されます。マネージャのディセーブルレベルは、ロガーの有効レベルよりも優先されます(this code参照)。

テストケースの冒頭に私のテストケースにラインlogging.disable(logging.NOTSET)を追加することで、ロギングマネージャdisableのプロパティがデフォルト値の0に設定されていることを確認しました。

関連する問題