Help us understand the problem. What is going on with this article?

Pythonのunittestでの、assertLogs()の使い方

Pythonのプログラムにおいて、「特定の処理が正しくログを出力していることを確認したい」というときはありませんか?unittestのメソッドassertLogs()はその疑問を解消するためのメソッドです。

ただ、日本語の利用例がなく、公式リファレンスももうちょっと分かりやすく書いて?な感じだったので、実動例を作ってみました。

assertLogs()とは

with文を利用するメソッドの一つで、with文内で発生した、ログの出力を、指定のコンテキストマネージャオブジェクトに格納する というメソッドです。よって単体でアサート処理を行うわけではなく、別のassertXXXメソッドと組み合わせて利用します。

test_XXX.py
import unittest
import logging

class Test_ProcessCaller(unittest.TestCase):

  # ...

  def test_processcaller_setlogger(self):
    logger = logging.getLogger("TEST")
    proc = ProcessCaller("python", "-V", logger=logger)
    with self.assertLogs(logger=logger, level=logging.DEBUG) as cm:
      proc.run()
    self.assertEqual(cm.output, ['DEBUG:TEST:python -V'])

上記コードは、「ProcessCaller#run()メソッドにおいて、デバッグレベルで呼び出したコマンドを出力することを確認する」というコードです。

with文のexpressionで、assertLogs()メソッドを呼び出すと、withブロック内でのログ出力がすべて、cm変数に格納されます。`assertLogs()'の引数にロガーやログレベルを指定することで、収集するログを限定することができます。

そして、withブロックを抜けると、cm変数にはoutputrecordという二つのプロパティが設定されます。

  • output:すべてのログを「画面に表示したときの文字列」の配列
  • record:すべてのログを示すrecordオブジェクトの配列

これをassertEqual()メソッドなどで期待した値と比較することで、「正しくログが出力されたか」を確認することができます。たとえば、上記のコードのProcessCallerクラスのコンストラクタ引数からloggerの指定を外すと・・・。

test_XXX.py
import unittest
import logging

class Test_ProcessCaller(unittest.TestCase):

  # ...

  def test_processcaller_setlogger(self):
    logger = logging.getLogger("TEST")
    proc = ProcessCaller("python", "-V")
    with self.assertLogs(logger=logger, level=logging.DEBUG) as cm:
      proc.run()
    self.assertEqual(cm.output, ['DEBUG:TEST:python -V'])

一行目で作成したloggerにはなにも出力されないため、テスト失敗となります。

TakamiChie
NPO法人 まちづくりエージェント SIDE BEACH CITY.理事。フリーランスのプログラマ。横浜・横須賀でIT勉強会の主催などをやってます。
https://onpu-tamago.net/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした