test시 여러가지 고충사항 : data 생성

김장훈·2020년 8월 17일
0

test시 원활한 테스트를 위해 데이터 셋을 만들때 사용하기 편한 package : pytest-factoryboy

  • 폴더 구조는 위 사진처럼 tests/ 아래에 facotry를 위치하였다.
import factory
from datetime import datetime
from faker import Factory as FakerFactory
from src.model.models import User, Todos

faker = FakerFactory.create()


class UserFactory(factory.alchemy.SQLAlchemyModelFactory):
    """ Define user factory
    """

    class Meta:
        model = User

    email = factory.Faker("safe_email")
    name = factory.LazyAttribute(lambda x: faker.name())

    # todos = factory.RelatedFactoryList(".tests.factories.TodosFactory", size=3)


class TodosFactory(factory.alchemy.SQLAlchemyModelFactory):
    """Define todo factory
    """

    class Meta:
        model = Todos

    title = factory.LazyAttribute(lambda x: faker.name())
    created_at = factory.LazyAttribute(lambda x: datetime.now())
    updated_at = factory.LazyAttribute(lambda x: datetime.now())

    user = factory.SubFactory(UserFactory)
  • 간단한 팩토리 클래스이다.
  • 향후 session을 사용하기 위해 상속을
UserFactory(factory.alchemy.SQLAlchemyModelFactory)

로 사용하였다.

  • 기본적으로 Factory들은 메타 정보를 가져오기 위해 원 모델을 불러와야한다.
from src.model.models import User

Class UserFactory(...):
	class Meta:
    	model = User
  • 그리고 각종 컬럼값들은 faker 또는 factory에서 자체 제공하는 기능등을 사용하였다.
  • factory.LazyAttribute의 경우 Factory를 사용할때마다 값이 생성되게 하는 것 같다.
  • subFactory를 통해서 해당 팩토리를 만들면 사전에 먼저 생성 되게 할 수 있는 것 같다.
class TodosFactory(...):
	...
    
	user = factory.SubFactory(UserFactory)
  • 즉 TodosFactory를 생성하면 User도 같이 생성이 된다. 이는 외래키등 관계일때 생성하기 위해 사용하면 좋을 것 같다.
profile
읽기 좋은 code란 무엇인가 고민하는 백엔드 개발자 입니다.

0개의 댓글