Faker와 Factory Boy
Faker
Faker
라이브러리는 실행 시점에 무작위 값을 생성
from faker import Faker
fake = Faker()
email = fake.email()
username = fake.user_name()
age = fake.pyint(min_value=0, max_value=100)
Facker
를 활용하여 Django
에서 임시 인스턴스를 만드는 방법
def test_post(self):
post = Post.objects.create(
blog=self.blog,
title=faker.sentence(),
tags=[faker.word()]
)
- 특정 값이 사라짐으로써 의도를 더 드러낼 수 있고, 매번 다른 값으로 테스트를 실행할 수 있어서 코드도 좀 더 안정적일 수 있음
Factory Boy
FactoryBoy 공식 문서
반복되는 테스트 코드 문제
- 테스트 코드에서 Blog의 Post를 열 개 만들어야 할 때
def setUp(self):
self.blog = Blog.objects.create(title='test blog')
def test_10_posts(self):
post1 = Post.objects.create(
blog=self.blog,
title=faker.sentence()
)
post2 = Post.objects.create(
blog=self.blog,
title=faker.sentence()
)
post3 = Post.objects.create(
blog=self.blog,
title=faker.sentence()
)
...
- 임시 데이터 생성용
Factory Boy
라이브러리를 사용하면 이를 간결하게 줄일 수 있음
Factory Boy로 테스트 코드 간략화하기
import factory
class BlogFactory(factory.django.DjangoModelFactory):
title = factory.Faker('sentence')
class PostFactory(factory.django.DjangoModelFactory):
class Meta:
model = Post
title = factory.Faker('sentence')
def setUp(self):
self.blog = BlogFactory()
def test_10_posts(self):
PostFactory.create_batch(10, blog=self.blog)
SubFactory 지정으로 연관 모델 함께 생성하기
- 새 Blog를 열 개 만들고, 각 Blog에 Post를 하나씩 만들고 싶을 때
class PostFactory(factory.django.DjangoModelFactory):
class Meta:
model = Post
blog = SubFactory(BlogFactory)
...
def test_10_blogs_and_posts(self):
PostFactory.create_batch(10)
- 이렇게 하면 Post를 생성하기 전 알아서 Blog를 생성
ChoiceField에 대응하는 FuzzyChoice
- Post에 카테고리를 지정한다고 가정
general
과 it
, book
카테고리 중 하나를 선택할 수 있도록 ChoiceField
로 지정해 두었다고 가정
- 테스트용 Post에서 세 카테고리 중 하나를 무작위로 골라서 넣어주고 싶을 때
class PostFactory(factory.django.DjangoModelFactory):
...
category = factory.fuzzy.FuzzyChoice(choices=['general', 'it', 'book'])
순차적인 값 Sequence
- 어떤 이유로 Post에 일련 번호를 지정해야 한다면
Sequence
를 사용할 수 있음
class PostFactory(factory.django.DjangoModelFactory):
...
slug = factory.Sequence(lambda n: f'slug-{n}')
- 이 외에도 특정 메서드를 실행한 값을 넣어줄 수 있는
LazyFunction
이나 인스턴스 스스로의 값을 참조하여 또다른 값을 생성해야 할 때 사용하는 LazyAttribute
등 다양한 기능이 존재