例外をスローする関数のテスト

Pythonでは、関数が正しく例外をスローするかをテストすることは非常に重要です。特に、エラー処理が期待通りに機能するかどうかを確認する際に、unittestモジュールのassertRaisesメソッドが便利です。ここでは、assertRaisesを使った基本的な方法と、例外メッセージの確認方法を詳しく解説します。

assertRaisesの基本使用法

Pythonunittestモジュールには、assertRaisesというメソッドが用意されています。このメソッドを使うと、特定の関数が例外をスローするかどうかを簡単に確認できます。例として、TypeErrorをスローする関数をテストするコードは次のようになります。

import unittest
def add_strings(a, b):
    return a + b
class TestAddition(unittest.TestCase):
    def test_raises_type_error(self):
        with self.assertRaises(TypeError):
            add_strings(1, 'one')

このテストでは、1 + 'one'を実行した際にTypeErrorが発生することを確認しています。もしTypeErrorが発生しない場合、このテストは失敗となります。

コンテキストマネージャを使った詳細な例外チェック

assertRaisesをコンテキストマネージャとして使用すると、例外オブジェクトをキャプチャして、そのメッセージや属性を詳しくチェックできます。以下の例では、スローされた例外のメッセージ内容をテストしています。

def broken_function():
    raise ValueError("これはエラーです")
class TestBrokenFunction(unittest.TestCase):
    def test_exception_message(self):
        with self.assertRaises(ValueError) as context:
            broken_function()
        self.assertTrue("これはエラーです" in str(context.exception))

pytestを使用したテスト

pytestを使用している場合、pytest.raisesを使うことで、同様の例外テストが可能です。次の例は、ZeroDivisionErrorをテストする方法です。

import pytest
def divide_by_zero():
    return 1 / 0
def test_zero_division():
    with pytest.raises(ZeroDivisionError):
        divide_by_zero()

まとめ

Pythonで関数が期待通りに例外をスローするかをテストする際には、assertRaisespytestraisesを活用することができます。特に、例外メッセージの確認や、複数の例外に対応する場合など、柔軟に対応できるこれらの手法は、バグを防ぐために非常に有効です。