Factory Boy中user_factory、build()与create()的区别及适用场景
Factory Boy中user_factory、build()、create()的区别与适用场景
前置代码示例
factories.py
# "factories.py" import factory from django.contrib.auth.models import User class UserFactory(factory.django.DjangoModelFactory): class Meta: model = User username = "John"
conftest.py
# "conftest.py" import pytest from pytest_factoryboy import register from tests.factories import UserFactory register(UserFactory)
test_ex1.py
# "test_ex1.py" import pytest from django.contrib.auth.models import User def test_user(db, user_factory): print(user_factory.username) # Here print(user_factory.build().username) # Here print(user_factory.create().username) # Here assert True
测试执行输出
$ pytest -q -rP . [100%] =============== PASSES ================ ____________ test_new_user ____________ -------- Captured stdout call --------- John John John 1 passed in 0.55s
技术问题
- 在Factory Boy中,
user_factory、user_factory.build()和user_factory.create()三者之间有什么区别? - 在Factory Boy中,分别应在什么场景下使用
user_factory、user_factory.build()和user_factory.create()?
问题解答
1. 三者核心区别
user_factory本身:它是工厂类的实例(相当于生成模型的"蓝图"),不是实际的模型对象。直接访问它的属性(比如username),拿到的是工厂定义里的默认值,不会生成任何模型实例——既不会在内存中创建对象,也不会写入数据库。user_factory.build():在内存中生成模型对象,但不会将对象保存到数据库。这个对象具备模型类的所有属性和方法,但和数据库完全无关,不会触发数据库写入操作。user_factory.create():不仅在内存中生成模型对象,还会调用模型的save()方法,把对象持久化到数据库。这会触发数据库的INSERT操作,后续可以通过ORM查询到该对象。
2. 适用场景
- 使用
user_factory本身:- 只需要获取工厂定义的默认属性值时,比如做参数对比、作为其他工厂的关联默认值。
- 不需要实际生成模型对象,只是要用到工厂配置的基础数据的场景。
- 使用
user_factory.build():- 测试不需要数据库交互的逻辑,比如测试模型的方法、表单验证(只需要模型对象的属性,无需写入数据库)。
- 想要快速生成对象,又不想因数据库操作拖慢测试速度的场景——跳过数据库写入,测试效率更高。
- 需要生成多个临时对象,且这些对象不需要持久化的场景。
- 使用
user_factory.create():- 测试涉及数据库交互的逻辑,比如测试ORM查询、视图函数中需要读取数据库数据的场景、权限验证(需要数据库中存在用户记录)。
- 测试需要持久化数据才能完成的功能,比如创建关联对象(外键关联要求被关联对象存在于数据库)。
- 任何需要真实数据库记录支撑的测试场景。
内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito
相关产品推荐
相关产品推荐

