Python2.7のunittestのassertRaisesはコンテキストマネージャーとして使用出来る

テスト対象

def add(x, y):
    return x + y

適当すぎだけどご勘弁。異なった型同士を足そうとすれば当然TypeError吐きますよね。

本題

Python2.7以前のunittestのassertRaisesは assertRaises(exception, callback, *args, **kwargs) というように呼び出す必要があった。

class SomeTest(unittest.TestCase):
    def test_add(self):
        # 正しい書き方
        self.assertRaises(TypeError, add, (2, [1, 2, 3]))
        # 間違った書き方
        self.assertRaises(TypeError, add(2, [1, 2, 3]))

このテストを実行すると間違った書き方のところでassertRaisesがTypeErrorを捕らえきれずに普通にテストが落ちます。でも、見た目的に間違った書き方のほうが感覚的にはしっくりするよなーっていうのが本音。

Python2.7以降のassertRaisesはコンテキストマネージャーとして使える

で、python2.7からはassertRaisesがコンテキストマネージャーとして使えるよう変更が加えられた。これにより、より直感的なこのような書き方が可能になった。

class SomeTest(unittest.TestCase):
    def test_add(self):
        with self.assertRaises(TypeError):
            add(2, [1, 2, 3])

実にスッキリしていてわかりやすい。まさにPythonicってやつですね。