web-dev-qa-db-ja.com

Django setUpTestData()vs. setUp()

Django 1.8には リファクタリングされたTestCase が付属しており、 setUpTestData() メソッドを介してトランザクションとセーブポイントを使用してクラスレベルでデータを初期化できます。これは、unittestの setUp() とは対照的で、すべてのテストメソッドの前に実行されます。

質問:setUp() in Django現在setUpTestData()が存在する場合のユースケースは何ですか?

客観的で高レベルの回答のみを探しています。そうしないと、この質問はスタックオーバーフローには広すぎます。

47
rnevius

クラスメソッドとして実行できないセットアップコードが存在することは珍しくありません。注目すべき例の1つはDjango テストクライアント :同じデータの多くを共有するテスト間で同じクライアントインスタンスを再利用したくない場合があります。 DjangoのSimpleTestCaseのサブクラスに自動的に含まれるクライアントインスタンスは、クラス全体ではなく テストメソッドごとに作成 です。Django1.8より前の世界からsetUpこのようなメソッド:

 def setUp(self):
 self.the_user = f.UserFactory.create()
 self.the_post = f.PostFactory.create(author = self.the_user)
 self.client.login(
 username = self.the_user.username、password = TEST_PASSWORD 
)
#...&c。
 

setUpsetUpTestDataに変更し、@classmethodデコレーターを上にスラップし、すべてのselfsをcls。しかし、それはAttributeError: type object 'MyTestCase' has no attribute 'client'で失敗します!代わりに、共有データにsetUpTestDataを使用し、テストメソッドごとのクライアントにsetUpを使用する必要があります。

 @classmethod 
 def setUpTestData(cls):
 cls.the_user = f.UserFactory.create()
 cls.the_post = f.PostFactory.create(author = cls.the_user)
#...&c。
 
 def setUp(self):
 self.client.login(
 username = self.the_user.username、password = TEST_PASSWORD 
)

注:コード例でその変数fが何をしているのか疑問に思っている場合、それは factoryboy から来ています-便利なフィクスチャテスト用のオブジェクトを作成するためのライブラリ。

40
Zack M. Davis

このテストチュートリアルから引用: https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Testing#Views

setUpTestData()は、クラスレベルのセットアップのテスト実行の開始時に1回呼び出されます。これを使用して、どのテストメソッドでも変更または変更されないオブジェクトを作成します。

setUp()は、すべてのテスト関数の前に呼び出され、テストによって変更される可能性のあるオブジェクトをセットアップします(テスト関数はすべて、これらのオブジェクトの「最新」バージョンを取得します)。

12
user2052130

キャッシュの問題。 Django=トランザクションのロールバックによるテスト分離の提供が向上しても、キャッシュは手動で生成およびクリアされます。

[編集]:SetUpTestDataは、各テスト後にDBが復元される状態を定義し、一度だけ実行されるメソッドを使用して、Djangoによってカーテンロールバックでトランザクションロールバックが実行されます。これはキャッシュでは機能しません。各テストでキャッシュを同じにしたい場合は、各テスト間でキャッシュをリセットする必要があるため、セットアップが必要です。 DjangoはDBをロールバックできますが、すべてをロールバックすることはできません。

(提案をありがとうbryan-oakley)

4
Joachim Jablon