yiskw note

機械学習やプログラミングについて気まぐれで書きます

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 =================================================

無事テストをパスすることができました!

参考