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")
この時、以下の様な順序で実行される。
- setUp
- test_it
- 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")
実行順序も同様。
- setUp
- test_it
- 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")
呼ばれるのは以下のみ
- 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")
この場合の実行順序は
- setUp
- doCleanups
となる。