Posted at

pytestでログ出力をテストしたい (caplog)


まえがき

みなさんpytest使ってますか?

便利ですよね。

今回、とある処理で出力されるログ出力結果をテストケースにする必要があり、

職場のSlackで呟いてみたら caplog というfixtureがpytestにあると教えてもらいました。

当初はログファイルを直接openして、中身を走査しようかと思っていましたが

caplog を使うことで非常に簡単にログ出力テストが実装できましたので、紹介します。


caplogとは


  • pytestにデフォルトで用意されているfixtureで、loggerに出力される内容を複数の形式でcaptureしてくれる機能。

  • pytestのドキュメントはここ


使い方


  • まぁ公式ドキュメントにある通りなんですが…


test.py

import logging

def outlog():
logger = logging.getLogger("test")
logger.info("これはinfoログ")
logger.warning("これはwarningログ")
logger.error("これはerrorログ")

class TestCapLog:
def test_caplog(self, caplog):
outlog()

assert ("test", logging.INFO, "これはinfoログ") not in caplog.record_tuples, "ログレベルがデフォルトなので、INFOは出力されない"
assert ("test", logging.WARNING, "これはwarningログ") in caplog.record_tuples
assert ("test", logging.ERROR, "これはerrorログ") in caplog.record_tuples

caplog.set_level(logging.INFO)
outlog()

assert ("test", logging.INFO, "これはinfoログ") in caplog.record_tuples, "ログレベルをINFOにしたので、INFOが出力される"



  • こんな感じで書いて、 pytest test.py を実行すると、全てのテストがPassするはず。

  • 上記で使用した record_tuples には、出力されたログが (logger_name, log_level, log_text) のタプルとしてlistに格納されています。

  • これ以外にも、 caplog.text とすると、出力されたログをstrとして生で取得することが出来ます。


最後に


  • ログ出力をテストするケースはあまりないのかもしれませんが、何かしらのチェック処理とかでワーニングを出したりしてエラーアラートサービスで検知していたりなどすると思いますので、
    想定しているとおりにログが出ていることをチェックするには caplog が便利というお話でした。