LoginSignup
14
12

More than 3 years have passed since last update.

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

Posted at

まえがき

みなさん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 が便利というお話でした。
14
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12