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と仲良くしないといけなそうなので、
いろいろ書けることがありそう。
それでは!!
20代前半までは東京で音楽をやりながら両手の指以上の業種でアルバイト生活をしていましたが、某大手プロバイダのテレアポのバイトでPCの知識の無さに愕然とし、コンピュータをもっと知りたい!と思ったことをきっかけに25歳の時にITの世界に未経験で飛び込みました。
紆余曲折を経て、現在は個人事業主としてお仕事させていただいており、10年ほどになります。
web制作から企業システム構築、ツール開発など、フロントエンドもバックエンドもサーバーもDBAも依頼があれば何でもやってきた雑食系エンジニアです。
今風にいうとフルスタックエンジニアということになるのでしょうか??
→ 詳細プロフィールというか、生い立ちはこちら
→スキルシートをご覧になる場合はこちら
→お仕事のご依頼やお見積りなどお問い合わせはこちらから!