標準ライブラリのunittestで例外の発生を確認するテスト

unittestで例外の発生を確認したい。thunkを作れば良さそう。
raiseが文じゃなければlambdaで包むだけで大丈夫なのだけど。

対象

  • unittestを使いたい(他のライブラリ入れるの面倒)
  • 例外の発生を確認するテストケースを書きたい

MyExceptionを検知

自分で定義したMyExceptionという例外を検知したい。
occurredMyExceptioinというメソッドを作成。

import unittest

class MyException(Exception):
    pass

class MyTest(unittest.TestCase):
    def occuredMyException(self, thunk):
        try:
            thunk()
            return False
        except MyException:
            return True

    def testraiseException(self):
        def thunk():
            raise MyException
        self.occuredMyException(thunk)

if __name__ == "__main__":
    unittest.main()

このままだと、例外毎にその例外を確認するメソッドを定義しなければならない。
引数として例外を渡せるようにしたい。

parametricに

import unittest

class MyException(Exception):
    pass

class ExtTestCase(unittest.TestCase):
    def __init__(self, *args, **kw):
        super(ExtTestCase, self).__init__(*args, **kw)
        
    def assertRaisedException(self, exception, thunk):
        try:
            thunk()
            return False
        except Exception, e:
            if isinstance(e, exception):
                return True
            else:
                raise e

class MyTestCase(ExtTestCase):
    def testMyException(self):
        def thunk():
            raise MyException
        self.assertRaisedException(MyException, thunk)

if __name__ == "__main__":
    unittest.main()