Help us understand the problem. What is going on with this article?

pythonでログ出力を単体テストする

More than 3 years have passed since last update.

こんにちはsekitakaです。

普段何気なくログを出力していますが、ログが確かに出力されていることをテストしたいことがたまにあります。
この記事では「ログが出力されている」ことをテストする方法を紹介します。

テスト方法

testfixtures

ログが出力されていることをテストするにはtestfixturesというパッケージを利用します。

pip install testfixtures

使用例

次の例ではput_logという関数がINFOレベルでfooというログを出力することをテストしています。

# coding=utf-8
from testfixtures import LogCapture
import logging
from unittest import TestCase
import unittest

logger = logging.getLogger()
def put_log(message):
    logger.info(message)

class Test(TestCase):
    def test_put_log(self):
        with LogCapture() as l:
            put_log("foo")
            l.check(
                ("root","INFO","foo")
            )

if __name__ == '__main__':
    unittest.main

応用

LogCapture()の引数によってloggerの名前や、キャプチャするログレベルのフィルタリングなどができます。
また log_str = str(l) とすることで、以下のような形式のログの全文を文字列として取得できるので、正規表現マッチングなどのアサーションによってテストするのも良いかもしれません。

root INFO
  foo

しかしどこまでテストするのかいつも悩ましい

runners
スポーツで世界を良くしたいエンジニアチーム。応援navi、.finisher、run&といった製品開発をしています!
https://www.wantedly.com/projects/167082
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away