Introduction
Factory Boy helps you create fake data easily for testing your Django apps. It saves time and keeps tests clean.
Jump into concepts and practice - no test required
Factory Boy helps you create fake data easily for testing your Django apps. It saves time and keeps tests clean.
import factory from myapp.models import MyModel class MyModelFactory(factory.django.DjangoModelFactory): class Meta: model = MyModel field1 = 'default value' field2 = factory.Faker('name')
Define a factory class inheriting from DjangoModelFactory.
Set the Meta.model to the Django model you want to create data for.
class UserFactory(factory.django.DjangoModelFactory): class Meta: model = User username = factory.Faker('user_name') email = factory.Faker('email') password = 'testpass'
UserFactory.class ArticleFactory(factory.django.DjangoModelFactory): class Meta: model = Article title = factory.Faker('sentence') content = factory.Faker('text') author = factory.SubFactory(UserFactory)
This test uses Factory Boy to create a user with fake username and email. It checks the user has these fields and prints them.
import factory from django.test import TestCase from django.contrib.auth.models import User class UserFactory(factory.django.DjangoModelFactory): class Meta: model = User username = factory.Faker('user_name') email = factory.Faker('email') password = 'testpass' class UserTest(TestCase): def test_user_creation(self): user = UserFactory() self.assertTrue(user.username) self.assertTrue(user.email) print(f"Created user: {user.username}, email: {user.email}")
You can customize fields with Faker or fixed values.
Use SubFactory to create related objects automatically.
Factories help keep tests fast and easy to write.
Factory Boy creates fake test data easily for Django models.
It helps avoid repetitive setup code in tests.
Use DjangoModelFactory and Faker to define factories.
Factory Boy in Django testing?Book using Factory Boy?DjangoModelFactory as the base class for Django models.Meta class with attribute model.class UserFactory(factory.DjangoModelFactory):
class Meta:
model = User
username = factory.Faker('user_name')
email = factory.Faker('email')UserFactory().username return?factory.Faker('user_name') generates a random username string each time the factory is called.UserFactory() creates a User instance with a random username, so .username returns that random string.class ProductFactory(factory.DjangoModelFactory):
class Meta:
model = Product
name = factory.Faker('product_name')
price = factory.Faker('float')factory.Faker('float') without arguments causes an error because Faker's float provider needs parameters.Order that has a foreign key to User. How do you correctly define the user field in OrderFactory to use UserFactory?factory.SubFactory with the related factory class.UserFactory() assigns an instance at class load time, not per object. RelatedFactory is for reverse relations. Faker does not create model instances.