【Python】unittestの使い方 例外処理

2021年2月15日

この記事はPython標準のunittestの基本的な使い方についての備忘録です。

例外処理のunittestについて記載します。
mockを使った例外処理のテストについては、以下の記事にまとめています。
mockの使い方を見る

開発環境

今回は以下の環境でunittestを実装していきます。

Python 3.7.7
OS:windows10
IDE:Visual Studio Code

テスト対象コード

以下のようなコードをテストします。
try_exceptメソッドでは、try-exceptで例外を取得し、取得した例外をraiseするようになっています。
msg_raiseメソッドでは、引数num2が「0」の場合、任意のエラーメッセージを設定してZeroDivisionErrorraiseしています。


class ExceptSampeClass():
    """例外処理のテスト対象クラス"""

    def try_except(self, num1, num2):
        """try-exceptで例外をraise"""

        try:
            answer = num1 / num2
        except ZeroDivisionError as e:
            raise e

        return answer

    def msg_raise(self, num1, num2):
        """任意のエラーメッセージを設定"""

        if num2 == 0:
            raise ZeroDivisionError('割る数がゼロです')

        return num1 / num2

テストコード

test_try_exceptメソッドでは、raiseされた例外が意図した例外であるかテストしています。
with self.assertRaises(ZeroDivisionError)の部分が例外のテストになります。
今回の場合は、assertRaisesメソッドの引数にZeroDivisionErrorを指定しているため、この指定した例外と実際にraiseされた例外が一致すればテスト成功となります。

test_msg_raiseメソッドでは、意図した例外であるかに加え、エラーメッセージが正しく設定されているかという点もテストしています。
raiseされた例外のエラーメッセージはargs[0]に格納されているため、その内容をassertEqualメソッドで確認しています。


from unittest import TestCase

from except_sample import ExceptSampeClass


class ExceptSampeClassTest(TestCase):
    """ExceptSampeClassのテストクラス"""
    def setUp(self):
        self.sample = ExceptSampeClass()

    def test_try_except(self):
        """try-exceptでraiseされた例外のテスト"""
        with self.assertRaises(ZeroDivisionError):
            self.sample.try_except(num1=10, num2=0)

    def test_msg_raise(self):
        """raiseされた例外のメッセージのテスト"""
        with self.assertRaises(ZeroDivisionError) as e:
            self.sample.msg_raise(num1=10, num2=0)

        self.assertEqual(e.exception.args[0], '割る数がゼロです')

    def tearDown(self):
        del self.sample

テスト結果

では実際に上記のテストコードを実行してみます。


$ python -m unittest tests.test_except
..
----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK

テストが成功しました。
これにより、意図した例外エラーが発生することが確認できました。
また、エラーメッセージも設定した内容が正しいことが確認できました。

まとめ

今回は例外のunittestについて記載しました。

例外処理が正しく実装されていないと、プログラムが意図しない挙動をしたり、プログラムで扱っているデータがおかしくなってしまったりと、色々な不具合を引き起こしてしまう可能性もあるため、例外処理もきちんとテストできるようにもっと理解を深めていきたいですね。

今回は簡単に確認できるコードを作成して例外のテストを記載しましたが、実際には例外を発生させるのが難しい場合もあると思います。
その場合はmockを使用して例外発生時の処理が正しく行われているか確認することができます。
mockについては以下の記事で解説しています。

参考文献

実際に作業を実施した際には、以下のサイトを参考にさせていただきました。

・公式ドキュメント(version 3.7)
https://docs.python.org/ja/3.7/library/unittest.html

・Python Tips: unittest で例外のテストをしたい
https://www.lifewithpython.com/2018/11/python-testing-exceptions-with-unittest.html


unittestの使い方については、他にもいろいろ記載しています。
よろしければ見ていってください。