Faker와 Factory Boy

GreenBean·2021년 12월 1일
0
post-thumbnail

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로 테스트 코드 간략화하기

# 임시 데이터 생성용 Factory를 선언
import factory

class BlogFactory(factory.django.DjangoModelFactory):
    title = factory.Faker('sentence')

class PostFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Post
    title = factory.Faker('sentence')



# 중복되는 테스트 코드를 Factory Boy로 다시 작성
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에 카테고리를 지정한다고 가정
    • generalit, 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 등 다양한 기능이 존재
profile
🌱 Backend-Dev | hwaya2828@gmail.com

0개의 댓글