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