LoginSignup
8
8

More than 5 years have passed since last update.

pythonのunittestでテストを書く時、失敗する可能性のあるsetUpにはdoCleanupsを使う

Posted at

unittestモジュールを利用してテストを書く際に、テストの準備をするためのfixtureを書く事がある。
tearDownはテスト関数中の例外を受け取って処理してくれるが。setUp中の例外に関しては素通りしてしまう。
失敗する可能性のあるsetUpに関してはdoCleanupsを使う。

test fixtureについて

unittestモジュールを利用してテストを書く際に、テストの準備をするためのfixtureを書く事がある。
例えばsetUp/tearDownがそれにあたる。

以下のように書く。

class Tests(unittest.TestCase):
    def setUp(self):
        print("setUp")

    def tearDown(self):
        print("tearDown")

    def test_it(self):
        print("before execute")
        _callFUT()
        print("after execute")

この時、以下の様な順序で実行される。

  1. setUp
  2. test_it
  3. tearDown

tearDownは2.のテスト関数で例外が発生した場合にも呼ばれる。


class Tests2(unittest.TestCase):
    def setUp(self):
        print("setUp")

    def tearDown(self):
        print("tearDown")

    def doCleanups(self):
        print("cleanup")

    def test_it(self):
        print("before execute")
        raise Exception
        print("after execute")

実行順序も同様。

  1. setUp
  2. test_it
  3. tearDown

setUpが例外を送出する場合

testのsetUpに書くコードも当然pythonコードなので、中には例外を発生する可能性のあるものも存在する。
このような場合にtearDownが実行後の後始末を保証してくれると捉えているのは危険。
事実、tearDownはsetUp中の例外には関知しない。

class Tests3(unittest.TestCase):
    def setUp(self):
        print("setUp")
        raise Exception("setup")

    def tearDown(self):
        print("tearDown")

    def test_it(self):
        print("before execute")
        raise Exception("execute")
        print("after execute")

呼ばれるのは以下のみ

  1. setUp

tearDownは呼ばれない。
この時、何らかの後処理を付加したい場合にはdoCleanupsを使う。
doCleanupsはsetUp,tearDown時の例外に関係なく無条件に呼ばれる。

class Tests4(unittest.TestCase):
    def setUp(self):
        print("setUp")
        raise Exception("setup")

    def tearDown(self):
        print("tearDown")

    def doCleanups(self):
        print("cleanup")

    def test_it(self):
        print("before execute")
        print("after execute")

この場合の実行順序は

  1. setUp
  2. doCleanups

となる。

8
8
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
8
8