1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

python:unittestで例外をテストする

Posted at

タイトル通りなのですが、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()に指定する例外クラスは基底クラスでもテストパスする
  • 必要であれば、例外パラメータの内容も検査できる
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?