サイトアイコン たーちゃんの「ゼロよりはいくらかましな」

【python】設定ファイルを読み込むloggerをモック化

pythonでログを出力する時、loggingを使用すると思います。

デフォルトでも十分に使用できますが、

ファイルサイズローテーションを個別に設定ファイルにして、

それを使用したロギングをすることの方が多いのではないでしょうか?

 

 

この場合、動作させるのには問題ないのですが、

こと単体テストとなると、例えばログ出力フォルダが存在しないと

エラーになってしまったりするため、モックにすると思います。

 

 

ですが、テスト対象クラスでlogging用の個別クラスを

importしているようなケースの場合、

loggingをモック定義してもモック定義が実行される前に

設定ファイルが読み込まれてしまい、うまくいきませんでした。

 

今回はそういったケースの解消方法について、

お話したいと思います。

 

 

 

 

 

ロギングファイル

以下のように設定ファイルを読み込む個別ロギングファイルがあるとします。

test_logger.py

import os
from logging import config, getLogger

import yaml

# logger設定をconfigから読み込む
DIR = os.path.dirname(__file__)
config.dictConfig(yaml.safe_load(open(f'{DIR}/config/Logging.config').read()))

logger = getLogger('test-log')

 

 

ロギング使用ファイル

上記のファイルをimportして以下のように使用しているとします。

hoge.py

from test_logger import getLogger

# logger設定
logger = getLogger(__name__)

def test() -> None:
  logger.info('test log')
  hoge()
  fuga()
 .....

 

 

失敗するモック化

上記のような場合、最初以下のように、

logger.infoについてモック化していました。

def test_test01(self, mocker: MockFixture) -> None:
  mocker.path('logging.Logger.info')
 .....

これでログ出力処理がモックされると見込んでいたのですが、

実際は、hoge.pyをimportした時点でtest_loggerのimport処理が実行されてしまい、

設定ファイルが読み込まれ、ログ出力フォルダが見つからないとエラーになってしまいました。

 

 

解決した方法

今回単体テストはpytestを使用していたため、

pytest.Fixtureを使用し、importタイミングを遅らせるという手法でこれを回避することが

できました。

@pytest.fixture
def test_setup(self, mocker: MockFixture):
    mocker.patch('logging.config.dictConfig')
    from hoge import test

    mocker.patch('logging.Logger.info')
   ....

def test_test01(self, test_setup) -> None:
    ....

 

pytest.Fixtureでテストの振る舞いをグループ化

pytest.Fixtureデコレーションをつけたメソッドは、

各単体テストに引数として渡すことができ、テストケースごとに

冗長に記載しなければならないような処理をグループ化してまとめることが

できるようになります。

 

今回の例であれば、mocker.patch(‘logging.config.dictConfig’)を

hoge.pyのimportより先に記載することで設定ファイルの読み込み部分を

先にモック化してからtest_loggerをimportするという一連の手順を

pytest.Fixtureでまとめてすべてのテストケースで使用するといった流れになります。

 

これで無事、設定ファイルに記載されたログ出力フォルダの設定に依存しない、

単体テストが実行できることになります。

 

pytest.Fixturemの中で、

mocker.patch(‘logging.Logger.info’)など、ログ出力部分を

モック化することをお忘れなく・・・。

 

 

まとめ

まだまだpythonに触ったばかりで文化の違いに驚くことが多いですが、

今回のようなノウハウをどんどん蓄積していきたいですね。

 

ということで、今回は設定ファイルを読み込むloggerのモック化について

直面した問題とその解決方法のお話をいたしました。

 

まだしばらくpythonと仲良くしないといけなそうなので、

いろいろ書けることがありそう。

 

それでは!!

 


にほんブログ村


人気ブログランキング

モバイルバージョンを終了