Python unittestのsetUp()とsetUpClass()の違いは何ですか?


99

違いは何であるsetUp()setUpClass()Pythonの中unittestのフレームワークは?セットアップが他の方法で処理されるのはなぜですか?

私は、セットアップの一部がで行われているかを理解したいsetUp()setUpClass()してだけでなく、機能tearDown()tearDownClass()

回答:


147

クラスに複数のテストメソッドがあると、違いが現れます。setUpClassそしてtearDownClassクラス全体に対して一度実行されます。setUpそしてtearDown、各テストメソッドの前と後に実行されています。

例えば:

class Example(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print("setUpClass")

    def setUp(self):
        print("setUp")

    def test1(self):
        print("test1")

    def test2(self):
        print("test2")

    def tearDown(self):
        print("tearDown")

    @classmethod
    def tearDownClass(cls):
        print("tearDownClass")

このテストを実行すると、次のように出力されます。

setUpClass
setUp
test1
tearDown
.setUp
test2
tearDown
.tearDownClass

(ドット(.)されているunittestテストを通過したときのデフォルトの出力。)ことを確認setUpし、tearDown前と後に現れるtest1 test2、一方setUpClasstearDownClass全体のテストケースの開始時と終了時に、一度だけ表示されます。


注文はこれでいいのでは?:setUpClass setUp test1 tearDown .setUp test2 .tearDown tearDownClass
Jai Sharma

「。」に注意してください tearDownの前と "。"の不在 tearDownClassの前
Jai Sharma

ああ、すみません、それを見つけられませんでした。いいえ、unittestテストが問題tearDownなく完了するまで、テストに合格したとは見なしません。
ベンジャミンホジソン

したがって、メソッドtest1とtest2のそれぞれに独自のsetUp&tearDownのセットが必要ですよね?あなたの答えでは、test1にはtearDownメソッドがないので、デフォルトの出力を印刷する必要があります(。で)。私が間違っている場合は修正してください。
Jai Sharma

1
答えの出力は正しいです。unittestの出力から直接貼り付けました。setUpおよびtearDownは、すべてのtestメソッドに対して1 回(したがって、この例では合計2回)実行されますがsetUpClass、およびtearDownClassは、それぞれ1回だけ実行されます。
ベンジャミンホジソン

15

違いは何であるsetUp()setUpClass()Pythonの中unittestのフレームワークは?

主な違い(Benjamin Hodgsonの回答で述べられているように)は、setUpClass1回だけ呼び出され、すべてのテストのsetUp前に呼び出されますが、すべてのテストの直前に呼び出されます。(注:同じことが、Pythonだけでなく、他のxUnitテストフレームワークの同等のメソッドにも適用されunittestます。)

unittest ドキュメントから:

setUpClass()

個々のクラスのテストが実行される前に呼び出されるクラスメソッド。setUpClassは、クラスを唯一の引数として呼び出され、classmethod()として装飾する必要があります。

@classmethod
def setUpClass(cls):
    ...

そして:

setUp()

テストフィクスチャを準備するために呼び出されるメソッド。これは、テストメソッドを呼び出す直前に呼び出されます。AssertionErrorまたはSkipTest以外の場合、このメソッドによって発生した例外は、テストの失敗ではなくエラーと見なされます。デフォルトの実装では何も行われません。

なぜセットアップが1つの方法で処理されるのですか?

質問のこの部分はまだ回答されていません。Gearonの回答に対する私のコメントのとおり、このsetUpメソッドは、すべてのテストに共通するフィクスチャの要素を対象としています(各テストでそのコードが重複しないようにするため)。重複を取り除くことで(通常は)読みやすさが向上し、メンテナンスの負担が軽減されるため、これはしばしば便利です。

このsetUpClass方法は、データベース接続を開く、ファイルシステムの一時ファイルを開く、テスト用の共有ライブラリをロードするなど、一度だけ実行する必要がある高価な要素用です。各テストの前にそのようなことを行うと、テストスイートが多すぎるため、すべてのテストの前に一度だけ実行します。これは、テストの独立性のわずかな低下ですが、一部の状況では必要な最適化です。おそらく、本当のことを使わずにデータベース/ファイルシステム/ライブラリ/何でもモックすることができるので、ユニットテストではそのようなことをすべきではありません。そのため、それsetUpClassが必要になることはほとんどありません。ただし、上記の例(または同様の例)のテストが必要になった場合に役立ちます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.