为什么factory_boy在测试中优于直接使用ORM?

21 投票
1 回答
4692 浏览
提问于 2025-04-18 04:38

我不明白为什么在Django测试中,大家更喜欢用factory_boy,而不是直接创建ORM或模型实例。factory_boy的网站也没怎么解释使用它的好处。

把它当作替代固定数据(fixtures)是有道理的,因为固定数据管理起来很麻烦,而且速度慢等等。

但是,为什么不直接根据测试需要创建模型实例呢?

如果factory_boy完全取代了对数据库的写入,那我觉得在这种情况下它会非常有用,但实际上,factory_boy创建的Django模型实例还是会和数据库互动。

另一个可能的好处是它支持序列,但其实不使用factory_boy也能很容易地创建序列或样本数据。

总的来说,我觉得使用factory_boy和直接创建对象或模型实例相比,几乎没有什么好处。

我希望我没有漏掉什么明显的东西!

1 个回答

27

是的,你可以直接用 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()
    
  • 这种基于类的方法的另一个好处是可以创建 子工厂

  • 你还可以轻松定义不同类型关系的工厂,比如 ForeignKey、反向 ForeignKeyManyToMany(详细信息见 文档)。

  • 有一个整洁的 DjangoModelFactory 类。
  • Sequence(正如你提到的)可以让数据更“动态”。想象一下如果自己来处理会是什么样子。
  • mute_signals 装饰器 - 有时候在测试时你不想让信号被触发。

总的来说,factory_boy 是为了避免写“辅助”函数来生成测试数据。它提供了一个简单易用的接口。

问问自己:为什么要重复造轮子,如果有专门的工具可以用呢?

另外可以看看:

撰写回答