You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

技术问题

  1. 在Factory Boy中,user_factory、user_factory.build()和user_factory.create()三者之间有什么区别?
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 20:50:06