テストケースで使用される「setUp」および「tearDown」Pythonメソッドについて説明する


93

それ以外のテストケースの作成中にPython setUptearDownメソッドの使用法を説明できる人はいますか?setUpテストメソッドを呼び出す直前に呼び出され、呼び出された直後に呼び出さtearDownれますか?

回答:


85

一般に、すべての必須ステップをsetUpに追加し、すべてのクリーンアップステップをtearDownに追加します。

ここで例を使用し詳細を読むことができます

setUp()メソッドが定義されると、テストランナーは各テストの前にそのメソッドを実行します。同様に、tearDown()メソッドが定義されている場合、テストランナーは各テストの後にそのメソッドを呼び出します。

たとえば、アイテムの存在または特定の状態を必要とするテストがあるので、これらのアクション(オブジェクトインスタンスの作成、dbの初期化、ルールの準備など)をsetUpに入れます。

また、各テストは開始された場所で停止する必要があることを知っているため、アプリの状態を初期状態に戻す必要があります。たとえば、ファイルを閉じる、接続、新しく作成されたアイテムの削除、トランザクションコールバックの呼び出しなど-これらすべてステップはtearDownに含まれます。

つまり、テスト自体に結果を取得するためにテストオブジェクトで実行するアクションのみを含める必要があるという考え方ですが、setUpとtearDownは、テストコードをクリーンで柔軟性のあるものにするためのメソッドです。

一連のテストに対してsetUpとtearDownを作成し、それらを親クラスで定義できます。そのため、このようなテストをサポートし、一般的な準備とクリーンアップを更新するのは簡単です。

簡単な例を探している場合は、次の例のリンク使用してください


54

これらを使用して、テストスイート内のすべてのテストに共通するコードを除外できます。

テストに多数の繰り返しコードがある場合は、このコードをsetUp / tearDownに移動することにより、コードを短くすることができます。

これは、テストデータの作成(例:偽物/モックの設定)、または偽物で関数をスタブ化するために使用できます。

統合テストを行う場合は、setUpで環境の前提条件を確認し、何かが適切に設定されていない場合はテストをスキップできます。

例えば:

class TurretTest(unittest.TestCase):

    def setUp(self):
        self.turret_factory = TurretFactory()
        self.turret = self.turret_factory.CreateTurret()

    def test_turret_is_on_by_default(self):
        self.assertEquals(True, self.turret.is_on())

    def test_turret_turns_can_be_turned_off(self):
        self.turret.turn_off()
        self.assertEquals(False, self.turret.is_on())

16
+1は、9行のコードで100%処理するために必要なすべてのことです。エレガントで簡潔な例。正直なところ、私がこのページで読んだのは、私の質問でもあった質問以外の9行だけです。コードサンプルの前に英語で何か言いましたか?必要ありませんでした!コードはそれをすべて言いました!マットに感謝します。
Nathan C. Tresch 2013年

2
「何かが適切に設定されていない場合にテストをスキップする」方法がここで示されているかどうかはわかりません。それともそれは余談でしたか?
user5359531 2017

6

10個のテストを含むスイートがあるとします。テストのうち8つは、同じセットアップ/ティアダウンコードを共有します。他の2つはしません。

セットアップとティアダウンは、これらの8つのテストをリファクタリングする良い方法を提供します。次に、他の2つのテストをどのように実行しますか?それらを別のテストケース/スイートに移動します。したがって、セットアップとティアダウンを使用すると、テストをケース/スイートに分割する自然な方法を提供するのにも役立ちます


1
テストを別のテストケースに移動することが望ましくない場合があります。この場合、セットアップ/ティアダウンコードを使用してデコレータを記述し、必要なテスト関数のみをデコレートできます。
Matthijs、2018年

2
これは決して質問への答えではありません。
断続的
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.