1. ホーム
  2. python

[解決済み] Pythonのコードをnoseでテストするとき、ログメッセージはどのように検証すればよいですか?

2023-01-21 16:34:17

質問

私は、特定の条件下で、私のアプリケーションのクラスが標準のロギングAPIを介してエラーをログに記録することを検証する簡単なユニットテストを書こうとしています。 この状況をテストする最もきれいな方法が何であるかは、うまくいきません。

私は、noseがすでにロギングプラグインを通してロギング出力をキャプチャしていることを知っていますが、これは失敗したテストのためのレポートおよびデバッギング補助として意図されているようです。

私が見ることができるこれを行うための2つの方法は、次のとおりです。

  • 断片的な方法 (mymodule.logging = mockloggingmodule) か、適切なモッキングライブラリで、logging モジュールをモックアウトしてください。
  • 出力をキャプチャし、それを検証するために、Nose プラグインを書くか、既存のものを使用します。

もし私が前者のアプローチに行くなら、私はロギングモジュールをモックアウトする前にグローバルな状態をリセットする最もきれいな方法を知りたいです。

この件に関するヒントとヒントを楽しみにしています...

どのように解決するのですか?

以前はロガーをモックしていましたが、このような状況ではロギングハンドラを使うのが一番だと思い jkpさんが提案してくれたドキュメント (今は死んでいますが、キャッシュされた インターネット・アーカイブ )

class MockLoggingHandler(logging.Handler):
    """Mock logging handler to check for expected logs."""

    def __init__(self, *args, **kwargs):
        self.reset()
        logging.Handler.__init__(self, *args, **kwargs)

    def emit(self, record):
        self.messages[record.levelname.lower()].append(record.getMessage())

    def reset(self):
        self.messages = {
            'debug': [],
            'info': [],
            'warning': [],
            'error': [],
            'critical': [],
        }