単体テストを行う際、テストを実行する前にデータベースに接続したり、テスト用の初期データを用意したりといった「前処理」が必要になることがよくあります。また、テスト終了後には、作成した一時ファイルを削除するなどの「後処理」が必要です。
Pythonの unittest フレームワークには、これらの処理を自動的に実行するための特別なメソッドが4つ用意されています。
この記事では、それぞれのメソッドの役割と実行タイミング、そして具体的な実装方法について解説します。
目次
4つの前処理・後処理メソッド一覧
unittest で利用できるセットアップとティアダウンのメソッドは、実行されるタイミング(メソッドごとか、クラスごとか)によって分類されます。
| メソッド名 | メソッドの種類 | 実行タイミング | 主な用途 |
setUp | インスタンスメソッド | 各テストメソッドの直前 | 変数の初期化、リストのクリアなど |
tearDown | インスタンスメソッド | 各テストメソッドの直後 | 一時データの削除、状態のリセットなど |
setUpClass | クラスメソッド | テストクラス実行開始時の最初(1回のみ) | データベース接続、重いリソースの読み込み |
tearDownClass | クラスメソッド | テストクラス実行終了時の最後(1回のみ) | データベース切断、リソースの解放 |
実行順序の確認
実際にコードを動かして、これらのメソッドがどのような順序で呼び出されるかを確認します。
setUpClass と tearDownClass には、必ず @classmethod デコレータが必要である点に注意してください。
import unittest
class TestLifecycleSample(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("\n=== setUpClass: クラス全体の初期化(最初に1回だけ実行) ===")
@classmethod
def tearDownClass(cls):
print("=== tearDownClass: クラス全体の終了処理(最後に1回だけ実行) ===")
def setUp(self):
print(" -> setUp: テストメソッドの準備")
def tearDown(self):
print(" <- tearDown: テストメソッドの後片付け")
def test_feature_a(self):
print(" [テストA] を実行中...")
def test_feature_b(self):
print(" [テストB] を実行中...")
if __name__ == "__main__":
unittest.main()
実行結果:
=== setUpClass: クラス全体の初期化(最初に1回だけ実行) ===
-> setUp: テストメソッドの準備
[テストA] を実行中...
<- tearDown: テストメソッドの後片付け
-> setUp: テストメソッドの準備
[テストB] を実行中...
<- tearDown: テストメソッドの後片付け
=== tearDownClass: クラス全体の終了処理(最後に1回だけ実行) ===
動作のポイント
setUpClassは最初に一度だけ実行されます。- その後に、テストメソッド(
test_feature_a,test_feature_b)が実行されますが、それぞれの直前にsetUp、直後にtearDownが毎回実行されていることがわかります。 - すべてのテストが終了した後、最後に
tearDownClassが一度だけ実行されます。
実践的な使い分け
setUp / tearDown を使うケース
テストメソッド同士が影響し合わないように、毎回「さら地」の状態に戻したい場合に使用します。
- テスト用リストや辞書の中身を空にする。
- テストごとに新しいインスタンスを作成する。
setUpClass / tearDownClass を使うケース
処理が重く、毎回実行するとテストに時間がかかりすぎる場合に使用します。
- データベースへのコネクション確立。
- Webブラウザの起動(Seleniumなど)。
- 巨大な設定ファイルの読み込み。
まとめ
setUp/tearDown: テストメソッドごとに毎回実行されます。テストの独立性を保つために重要です。setUpClass/tearDownClass: クラス全体で一度だけ実行されます。@classmethodが必要で、重い初期化処理の共有に使われます。
これらを適切に使い分けることで、信頼性が高く、かつ実行速度も考慮されたテストコードを書くことができます。
