LoginSignup
0
0

More than 3 years have passed since last update.

Django で factory_boy のシード値を固定する

Last updated at Posted at 2020-06-02

結論

TestCase を継承したカスタムクラスを作成して setUp() にシード値を設定する。
各アプリではカスタムクラスを継承してテストを書く。

背景

Djangoで factory_boy を使う際に、テストの再現性を担保したかった。

手順

環境

factory-boy==2.12.0

BaseTestCase クラスの定義

シード値を固定する BaseTestCase クラスを定義する。
自分は base アプリケーションを作成して、抽象クラスはそこに書くようにしている。

./base/tests.py
from django.test import TestCase
import factory.random


class BaseTestCase(TestCase):
    def setUp(self):
        factory.random.reseed_random(0)
        return super().setUp()

個別の TestCase クラスの継承

BaseTestCase クラスを継承して各テストケースを定義していく。

./user/tests.py
from base.tests import BaseTestCase

from .models import User
from .factories import UserFactory


class UserTestCase(BaseTestCase):
    def test_create_user(self):
        user = UserFactory()
        actual_user = User.objects.get(pk=user.pk)
        self.assertEqual(user, actual_user)

もちろん setUp() を定義する際は親クラスのメソッドも呼んでおく。

./user/tests.py
class UserTestCase(BaseTestCase):
    def setUp(self):
        super().setUp()
        print("initialize")

    def test_create_user(self):
        user = UserFactory()
        actual_user = User.objects.get(pk=user.pk)
        self.assertEqual(user, actual_user)

まとめ

シード値の固定により再現性を担保した状態でテストが実行できるようになった。
Djangoを前提の記事だが、Djangoに限らず通用するはず。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0