FactoryBoy 工厂模式库入门指南
什么是 FactoryBoy
FactoryBoy 是一个用于创建测试对象的 Python 工厂模式库。它提供了一种标准化的方式来生成对象实例,同时允许在每次调用时覆盖某些字段值。这个库特别适合在测试场景中使用,可以大大简化测试数据的准备工作。
核心概念
基本用法
创建一个工厂类非常简单:
- 继承
factory.Factory
类(或其适合的子类) - 添加
class Meta
内部类 - 设置
model
属性为目标类 - 为类的
__init__
方法添加默认关键字参数
import factory
from . import base
class UserFactory(factory.Factory):
class Meta:
model = base.User
firstname = "John"
lastname = "Doe"
使用时可以直接生成实例:
john = UserFactory() # 生成默认用户 John Doe
jack = UserFactory(firstname="Jack") # 生成自定义用户 Jack Doe
序列生成器
对于需要唯一值的字段(如用户名),可以使用 Sequence
:
class UserFactory(factory.Factory):
username = factory.Sequence(lambda n: 'user%d' % n)
每次调用工厂时,序列号会自动递增:
UserFactory() # 生成 user0
UserFactory() # 生成 user1
延迟计算字段
FactoryBoy 提供了几种延迟计算字段值的方式:
-
LazyFunction - 用于不依赖对象本身的简单计算
timestamp = factory.LazyFunction(datetime.now)
-
LazyAttribute - 用于依赖对象其他属性的计算
email = factory.LazyAttribute(lambda obj: '%s@example.com' % obj.username)
工厂继承
工厂类支持继承,子类会继承父类的所有声明并可以覆盖它们:
class AdminFactory(UserFactory):
admin = True
group = 'admins'
非关键字参数
对于需要位置参数的类,可以使用 inline_args
:
class MyFactory(factory.Factory):
class Meta:
model = MyClass
inline_args = ('x', 'y')
参数和特性
-
Params - 定义非模型字段的参数
class Params: duration = 12
-
Traits - 基于标志位批量修改多个字段
class Params: shipped = factory.Trait( status='shipped', shipped_by=factory.SubFactory(EmployeeFactory) )
构建策略
FactoryBoy 支持两种主要构建策略:
build()
- 创建但不保存对象create()
- 创建并保存对象(对于 Django 模型会调用save()
)
默认策略可以通过 class Meta
的 strategy
属性修改。
最佳实践
- 命名规范:工厂类名通常以"Factory"结尾,如
UserFactory
- 默认值:为所有必填字段提供合理的默认值
- 序列号:为唯一字段使用
Sequence
避免冲突 - 继承:利用工厂继承减少重复代码
- 参数化:使用
Params
和Traits
使工厂更灵活
总结
FactoryBoy 是一个强大的测试数据生成工具,通过工厂模式简化了测试对象的创建过程。它提供了丰富的功能来处理各种对象创建场景,包括唯一值生成、延迟计算、继承和参数化等特性。掌握这些核心概念可以帮助开发者编写更简洁、更易维护的测试代码。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考