確認済み環境
- python3.4
概要
unittestが複数のテストを行うとき、setUpはテストを呼び出すごとに実行される。しかし、setUpの処理が重い場合は複数回呼び出されることで実行時間がかかりすぎる。
そこで、setUpを一回だけ呼び出したい場合どのように記述すれば良いか?それは、setUpを使う代わりにsetUpClassを定義することで解決する。
具体例として下記のようなコードを挙げる。
test_setup.py
import unittest
class HogeTest(unittest.TestCase):
def setUp(self):
print('Called `setUp`.')
@classmethod
def setUpClass(self):
print('Called `setUpClass`.')
def test_called1(self):
self.assertTrue(True)
def test_called2(self):
self.assertTrue(True)
def test_called3(self):
self.assertTrue(True)
このコードはsetUp
とsetUpClass
の初期化時に実行されるメソッドを持っている。これらはそれぞれunittestから提供されるメソッドである。また、ここでのメソッドは実行される度に文字列を出力するように定義した。またテストは3つ定義されている。
ここで、出力される文字列によってこのコードが期待する動作をするか確かめよう。
setUp
での文字列が複数回出力されること、またsetUpClass
での文字列が一回出力されることを期待する。
実際に実行した結果がこちらだ。
$ python3 -m unittest test_setup.py
Called `setUpClass`.
Called `setUp`.
.Called `setUp`.
.Called `setUp`.
.
----------------------------------------------------------------------
Ran 3 tests in 0.001s
OK
確かに期待した動作をしていることが確認できた。
参考
qiita: python unittestのテンプレート
stackoverflow: Run setUp only once