タイトル通りなのですが、pythonのunittestで例外が発生するケースのテストについて、サンプルと結果をメモします。
参照: https://docs.python.org/ja/3/library/unittest.html#unittest.TestCase.assertRaises
テスト対象コード
良い題材とは言えませんが、シンプルに引数によって例外を変えています。
main.py
class MyException(Exception):
pass
def execute(value):
if value == 0:
raise MyException
if value == 1:
raise MyException('value is 1')
raise Exception
テストコード
test_main.py
import unittest
from main import execute, MyException
class MainTests(unittest.TestCase):
def test_execute(self):
# (1)引数=0...MyException
with self.assertRaises(MyException):
execute(0)
# (2)引数=0...MyExceptionだが、基底クラスであるExceptionを指定してもOK
# (指定クラスのサブクラスであればOK)
with self.assertRaises(Exception):
execute(0)
# (3)引数=1...MyException('value is 1')
with self.assertRaises(MyException) as cm:
execute(1)
# コンテキストマネージャが保持している例外オブジェクトのargsプロパティを確認できる
self.assertEqual(cm.exception.args[0], 'value is 1')
# (4)引数=2...Exception
with self.assertRaises(Exception):
execute(2)
ファイルツリー
$ tree .
.
├── main.py
└── test_main.py
テスト実行
$ python -m unittest
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
ポイント
- self.assertRaises()に指定する例外クラスは基底クラスでもテストパスする
- 必要であれば、例外パラメータの内容も検査できる