테스트용 객체 생성을 편하게 - model_mommy
개인적으로 테스트를 작성하면서 귀찮다고 여겼던 부분 중 하나는 테스트용 데이터(테스트 픽스처) 구축이었다. Django에서 테스트 전에 테스트 픽스처를 불러들이는 기능을 제공하지만, 이걸 만드는 일 자체가 귀찮기도 하고 어떤 데이터인지 확인하려면 json 파일을 열어봐야 하니까.
그러던 중에 Object Factory라는 도구를 알게 되었다. 여러 가지가 있지만(대표적으론 Factory Boy) 가장 간단해서 사용하게 된 model_mommy를 소개해볼까 한다.
설치
$ pip install model_mommy
테스트용 객체 만들기
다음과 같은 Author 모델이 있다고 하자.
# models.py
class Author(models.Model):
name = models.CharField(max_length=35)
이제 model_mommy를 사용하여 테스트용 객체를 만들 수 있다.
# test_models.py
from django.test import TestCase
from model_mommy import mommy
class TestAuthor(TestCase):
def setUp(self):
self.author = mommy.make('Author')
이때 Author 모델의 name 속성은 임의의 글자 35개(max_length=35
)로 생성되는데, 이를 직접 지정할 수도 있다.
self.author = mommy.make(
'Author',
name='test_name'
)
외부키 연결
이제 models.py
에 Book 모델을 추가하고, Author 모델과 연결했다고 하자.
# models.py
class Book(models.Model):
title = models.CharField(max_length=150)
author = models.ForeignKey('Author')
그리고 테스트에서 특정 Author 객체와 연결된 Book 모델을 만들고 싶다면,
# test_models.py
# ... (생략) ...
class TestBook(TestCase):
def setUp(self):
self.author = mommy.make('Author')
self.book = mommy.make('Book', author=self.author)
연결된 모델의 속성도 지정할 수 있다.
self.book = mommy.make(
'Book',
author__name='test_related_name'
)
한꺼번에 여러 객체 만들기
객체를 한꺼번에 하나 이상 만들고 싶다면,
books = mommy.make(
'Book',
_quantity=100
)
너무 많이 만들면(10,000개 이상?) 테스트 실행 시간도 늘어난다.
이 외에도 Recipe를 만들어 두고 재활용하거나, 만드는 순서에 따라 번호를 매기는 Sequence 등의 기능도 있으니 참고하길.
COMMENTS