pytestでloggingのログ出力をテストする
概要
pytestでloggingのログ出力をテストする方法について調べたので,こちらにまとめておきます.
ディレクトリ構造
便宜上以下のディレクトリ構造を想定してテストの方法を解説します.
. ├── pac │ ├── __init__.py │ └── mod.py └── test_mod.py
pac/mod.py
の中身
ログを出力するだけの関数を定義しておきます.
from logging import getLogger logger = getLogger(__name__) def func() -> None: logger.debug("debug") logger.info("info") logger.warning("warning") logger.error("error")
pytestを用いたテストの方法
pytestの組み込みのfixtureであるcaplogを使用することで,ログのテストを行うことができます.
from logging import DEBUG, ERROR, INFO, WARNING from _pytest.logging import LogCaptureFixture from pac.mod import func def test_func(caplog: LogCaptureFixture): # ログレベルの設定 caplog.set_level(DEBUG) # 関数を実行 func() # ログ出力のテスト assert ("pac.mod", DEBUG, "debug") in caplog.record_tuples assert ("pac.mod", INFO, "info") in caplog.record_tuples assert ("pac.mod", WARNING, "warning") in caplog.record_tuples assert ("pac.mod", ERROR, "error") in caplog.record_tuples
ログで出力された内容は,caplog.record_tuples
で取得することができ,
(loggerの名前, ログレベル, ログの内容)
の形式で保存されています.
実際にテストを実行してみます.
$ pytest test_mod.py =============================================== test session starts ================================================ platform darwin -- Python 3.8.2, pytest-6.1.2, py-1.9.0, pluggy-0.13.1 rootdir: /Users/yuchi/Documents/study_logging plugins: anyio-2.2.0, Faker-5.0.1, django-3.10.0, mock-3.3.1, cov-2.10.1, dash-1.16.3 collected 1 item test_mod.py . [100%] ================================================ 1 passed in 0.09s =================================================
無事テストをパスすることができました!