Django 1.8には リファクタリングされたTestCase が付属しており、 setUpTestData() メソッドを介してトランザクションとセーブポイントを使用してクラスレベルでデータを初期化できます。これは、unittestの setUp() とは対照的で、すべてのテストメソッドの前に実行されます。
質問:setUp()
in Django現在setUpTestData()
が存在する場合のユースケースは何ですか?
客観的で高レベルの回答のみを探しています。そうしないと、この質問はスタックオーバーフローには広すぎます。
クラスメソッドとして実行できないセットアップコードが存在することは珍しくありません。注目すべき例の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。
setUp
をsetUpTestData
に変更し、@classmethod
デコレーターを上にスラップし、すべてのself
sを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 から来ています-便利なフィクスチャテスト用のオブジェクトを作成するためのライブラリ。
このテストチュートリアルから引用: https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Testing#Views
setUpTestData()は、クラスレベルのセットアップのテスト実行の開始時に1回呼び出されます。これを使用して、どのテストメソッドでも変更または変更されないオブジェクトを作成します。
setUp()は、すべてのテスト関数の前に呼び出され、テストによって変更される可能性のあるオブジェクトをセットアップします(テスト関数はすべて、これらのオブジェクトの「最新」バージョンを取得します)。
キャッシュの問題。 Django=トランザクションのロールバックによるテスト分離の提供が向上しても、キャッシュは手動で生成およびクリアされます。
[編集]:SetUpTestDataは、各テスト後にDBが復元される状態を定義し、一度だけ実行されるメソッドを使用して、Djangoによってカーテンロールバックでトランザクションロールバックが実行されます。これはキャッシュでは機能しません。各テストでキャッシュを同じにしたい場合は、各テスト間でキャッシュをリセットする必要があるため、セットアップが必要です。 DjangoはDBをロールバックできますが、すべてをロールバックすることはできません。
(提案をありがとうbryan-oakley)