테스트용 객체 생성을 편하게 - 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 등의 기능도 있으니 참고하길.