1. ホーム
  2. python

Django setUpTestData() vs. setUp()

2023-09-25 18:17:24

質問

Django 1.8 に同梱されている リファクタリングされたテストケース を介して、トランザクションとセーブポイントを使ったクラスレベルでのデータ初期化を可能にします。 setUpTestData() メソッドによって行います。これとは対照的に、unittest の setUp() はテストメソッドのひとつひとつの前に実行されます。

質問です。 のユースケースは何ですか? setUp() を使用するケースは何ですか? setUpTestData() は存在するのでしょうか?

私は客観的でハイレベルな回答のみを探しています。そうでなければ、この質問はStack Overflowには広すぎますから。

どのように解決するのですか?

クラスメソッドとして実行できない設定されたコードがあることは珍しくありません。顕著な例として、Django の テストクライアント : そうでなければ同じデータの多くを共有するテスト間で同じクライアントインスタンスを再利用したくないかもしれませんし、実際、クライアントのインスタンスが自動的に Django の SimpleTestCase のサブクラスに自動的に含まれるクライアントインスタンスは テストメソッドごとに作成されます をクラス全体ではなく、テストメソッドごとに作成します。例えば、Django 1.8 以前のテストに setUp メソッドを持つテストがあったとします。

    def setUp(self):
        self.the_user = f.UserFactory.create()
        self.the_post = f.PostFactory.create(author=self.the_user)
        self.client.login()を実行します。
            ユーザ名=self.the_user.username, パスワード=TEST_PASSWORD
        )
        # ... &c.


を変更することで、テストケースを近代化したいと思うかもしれません。 setUpsetUpTestData を叩いて @classmethod デコレータを追加し、すべての selfcls . しかし、これでは AttributeError: type object 'MyTestCase' has no attribute 'client' ! を使用する必要があります。 setUpTestData を共有データに、そして setUp をテストメソッドごとのクライアントに使用します。

    クラスメソッド
    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(
            ユーザ名=self.the_user.username, パスワード=TEST_PASSWORD
        )

注:もしあなたが、この変数が何であるか疑問に思っているなら f がこの例のコードで何をしているかというと、それは 工場少年 - から来ています。