Почему factory_boy лучше использовать ORM непосредственно в тестах?

Я не понимаю, почему factory_boy предпочтительнее создания экземпляров ORM/model непосредственно в тестах Django. И сайт factory_boy мало что может объяснить преимущества его использования.

Это имеет смысл в качестве альтернативы светильникам, которые трудно справиться, медленны и т.д. и т.д.

Но почему бы просто не создавать экземпляры модели, необходимые для тестов?

Если factory_boy полностью заменил запись на db, то отлично, я думаю, что это было бы очень полезно в этом случае, но созданный мальчик factory создавал экземпляры модели django, все еще взаимодействуя с базой данных.

Другим потенциальным преимуществом является поддержка последовательностей, но нетрудно создать последовательности/примеры данных без необходимости для factory boy.

В целом я вижу практически никаких преимуществ при использовании factory boy, а не напрямую создавая экземпляры объектов/моделей.

Надеюсь, что я пропустил нечто очевидное!

Ответ 1

Да, вы можете подготовить свои тестовые данные напрямую с помощью django ORM. Но есть преимущества использования фабрик и factory_boy в частности, вот некоторые из них, которые я помню и использую:

  • ваши модельные заводы определяются красивым, чистым и читаемым образом:

    class CasesFactory(factory.Factory):
        FACTORY_FOR = models.Case
    
        number = factory.Sequence(lambda n: '1021-{0}'.format(n))
        create_date = datetime.datetime.now()
    
  • Еще одно преимущество этого подхода на основе классов - это возможность создавать SubFactories

  • также вы можете легко определить фабрики для разных отношений: ForeignKey, reverse ForeignKey, ManyToMany (документация)

  • аккуратный DjangoModelFactory класс
  • Sequence (как вы уже упоминали) помогает сделать данные более "динамическими". Представьте себе, как обращаться с ним самостоятельно.
  • mute_signals decorator - иногда во время тестирования вы не хотите, чтобы сигнал отправлялся

В принципе, factory_boy существует, чтобы избежать написания "вспомогательных" функций для генерации тестовых данных. Вместо этого он представляет удобный и простой в использовании интерфейс.

Спросите себя: зачем изобретать колесо, есть ли инструмент специально для этой работы?

Также смотрите: