Python unittestの前処理と後処理:setUp, tearDown, setUpClass, tearDownClassの完全ガイド

単体テストを行う際、テストを実行する前にデータベースに接続したり、テスト用の初期データを用意したりといった「前処理」が必要になることがよくあります。また、テスト終了後には、作成した一時ファイルを削除するなどの「後処理」が必要です。

Pythonの unittest フレームワークには、これらの処理を自動的に実行するための特別なメソッドが4つ用意されています。

この記事では、それぞれのメソッドの役割と実行タイミング、そして具体的な実装方法について解説します。

目次

4つの前処理・後処理メソッド一覧

unittest で利用できるセットアップとティアダウンのメソッドは、実行されるタイミング(メソッドごとか、クラスごとか)によって分類されます。

メソッド名メソッドの種類実行タイミング主な用途
setUpインスタンスメソッドテストメソッドの直前変数の初期化、リストのクリアなど
tearDownインスタンスメソッドテストメソッドの直後一時データの削除、状態のリセットなど
setUpClassクラスメソッドテストクラス実行開始時の最初(1回のみ)データベース接続、重いリソースの読み込み
tearDownClassクラスメソッドテストクラス実行終了時の最後(1回のみ)データベース切断、リソースの解放

実行順序の確認

実際にコードを動かして、これらのメソッドがどのような順序で呼び出されるかを確認します。

setUpClasstearDownClass には、必ず @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回だけ実行) ===

動作のポイント

  1. setUpClass は最初に一度だけ実行されます。
  2. その後に、テストメソッド(test_feature_a, test_feature_b)が実行されますが、それぞれの直前setUp直後tearDown が毎回実行されていることがわかります。
  3. すべてのテストが終了した後、最後に tearDownClass が一度だけ実行されます。

実践的な使い分け

setUp / tearDown を使うケース

テストメソッド同士が影響し合わないように、毎回「さら地」の状態に戻したい場合に使用します。

  • テスト用リストや辞書の中身を空にする。
  • テストごとに新しいインスタンスを作成する。

setUpClass / tearDownClass を使うケース

処理が重く、毎回実行するとテストに時間がかかりすぎる場合に使用します。

  • データベースへのコネクション確立。
  • Webブラウザの起動(Seleniumなど)。
  • 巨大な設定ファイルの読み込み。

まとめ

  • setUp / tearDown: テストメソッドごとに毎回実行されます。テストの独立性を保つために重要です。
  • setUpClass / tearDownClass: クラス全体で一度だけ実行されます。@classmethod が必要で、重い初期化処理の共有に使われます。

これらを適切に使い分けることで、信頼性が高く、かつ実行速度も考慮されたテストコードを書くことができます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次