回答:
クラスに複数のテストメソッドがあると、違いが現れます。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
、一方setUpClass
とtearDownClass
全体のテストケースの開始時と終了時に、一度だけ表示されます。
unittest
テストが問題tearDown
なく完了するまで、テストに合格したとは見なしません。
setUp
およびtearDown
は、すべてのtest
メソッドに対して1 回(したがって、この例では合計2回)実行されますがsetUpClass
、およびtearDownClass
は、それぞれ1回だけ実行されます。
setUp()
とsetUpClass()
Pythonの中unittest
のフレームワークは?主な違い(Benjamin Hodgsonの回答で述べられているように)は、setUpClass
1回だけ呼び出され、すべてのテストのsetUp
前に呼び出されますが、すべてのテストの直前に呼び出されます。(注:同じことが、Pythonだけでなく、他のxUnitテストフレームワークの同等のメソッドにも適用されunittest
ます。)
unittest
ドキュメントから:
setUpClass()
個々のクラスのテストが実行される前に呼び出されるクラスメソッド。setUpClassは、クラスを唯一の引数として呼び出され、classmethod()として装飾する必要があります。
@classmethod
def setUpClass(cls):
...
そして:
setUp()
テストフィクスチャを準備するために呼び出されるメソッド。これは、テストメソッドを呼び出す直前に呼び出されます。AssertionErrorまたはSkipTest以外の場合、このメソッドによって発生した例外は、テストの失敗ではなくエラーと見なされます。デフォルトの実装では何も行われません。
質問のこの部分はまだ回答されていません。Gearonの回答に対する私のコメントのとおり、このsetUp
メソッドは、すべてのテストに共通するフィクスチャの要素を対象としています(各テストでそのコードが重複しないようにするため)。重複を取り除くことで(通常は)読みやすさが向上し、メンテナンスの負担が軽減されるため、これはしばしば便利です。
このsetUpClass
方法は、データベース接続を開く、ファイルシステムの一時ファイルを開く、テスト用の共有ライブラリをロードするなど、一度だけ実行する必要がある高価な要素用です。各テストの前にそのようなことを行うと、テストスイートが多すぎるため、すべてのテストの前に一度だけ実行します。これは、テストの独立性のわずかな低下ですが、一部の状況では必要な最適化です。おそらく、本当のことを使わずにデータベース/ファイルシステム/ライブラリ/何でもモックすることができるので、ユニットテストではそのようなことをすべきではありません。そのため、それsetUpClass
が必要になることはほとんどありません。ただし、上記の例(または同様の例)のテストが必要になった場合に役立ちます。