pythonで、ある内容がログ出力されることをテストする場合どうするのが一般的なのか
調べてたらログハンドラをsetUpでStreamHandlerに差し替えてテストする方法を見つけたので、サンプルを書いて試してみました
以下のような感じです
# coding=utf-8 import unittest import logging from StringIO import StringIO logger = logging.getLogger(__file__) class SampleTest(unittest.TestCase): def setUp(self): self.original_logger = logger self.stream = StringIO() self.log_handler = logging.StreamHandler(self.stream) self.original_logger.setLevel(logging.INFO) for handler in self.original_logger.handlers: self.original_logger.removeHandler(handler) self.original_logger.addHandler(self.log_handler) def tearDown(self): self.original_logger.removeHandler(self.log_handler) self.log_handler.close() def test_logging_info(self): """loggingされる内容をテストする """ logging_something() self.log_handler.flush() self.assertEquals(self.stream.getvalue().rstrip(), u'この味は!、、、 嘘をついている「味」だぜ、、、') def logging_something(): logger.info(u'この味は!、、、 嘘をついている「味」だぜ、、、')
stream.getvalue()で取り出した結果は改行コードが含まれているのでrstripで取り除いてます。
ただこの方法だと、warnとかinfoの区別できない。
やっぱloggerをmockにして確認するのがよいのかなぁ