logutilsのTestHandlerでログ出力をテストする

logutilsにTestHandlerというクラスが用意されてるので、「view関数で出力されたログをテストする」方法を試してみました。

vinay.sajip / logutils ― Bitbucket


適当にview関数を用意。処理中にwarningログを出力する。
views.py

import logging

from django.views.generic import TemplateView
logger = logging.getLogger()


class SampleView(TemplateView):
    template_name = 'apps/sample.html'

    def get_context_data(self, **kwargs):
        ctx = super(SampleView, self).get_context_data(**kwargs)
        logger.warn('hoge')
        # 適当な処理
        return ctx


んでテスト
tests.py

class SampleViewTest(TestCase):
    def setUp(self):
        self.handler = TestHandler(Matcher())
        self.logger = logging.getLogger()
        self.logger.addHandler(self.handler)

    def tearDown(self):
        self.logger.removeHandler(self.handler)
        self.handler.close()

    def test_log(self):
        client = Client()
        client.get(reverse('sample'))
        self.assertTrue(self.handler.matches(levelno=logging.WARNING))
        self.assertTrue(self.handler.matches(msg="hoge"))
        self.assertFalse(self.handler.matches(levelno=logging.ERROR))
        self.assertFalse(self.handler.matches(msg="fuga"))

ログレベルとログの内容を確認できている。