为什么factory_boy在测试中优于直接使用ORM?
我不明白为什么在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
、反向ForeignKey
和ManyToMany
(详细信息见 文档)。- 有一个整洁的
DjangoModelFactory
类。 Sequence
(正如你提到的)可以让数据更“动态”。想象一下如果自己来处理会是什么样子。mute_signals
装饰器 - 有时候在测试时你不想让信号被触发。
总的来说,factory_boy
是为了避免写“辅助”函数来生成测试数据。它提供了一个简单易用的接口。
问问自己:为什么要重复造轮子,如果有专门的工具可以用呢?
另外可以看看:
- 测试与 Django(Carl Mayer 的演示文稿)