测试工厂模式:动态 Fixture 与 Scenario 构建
使用 factory_boy 和 Faker 构建复杂的测试数据场景,结合 pytest fixture 实现可复用的测试上下文。 · 难度:入门 · +10XP
动态测试工厂
传统 Django TestCase 依赖固定 fixtures,维护困难。本教程将教授如何用 factory_boy 创建关联工厂(如用户-订单-商品链),并利用 SubFactory 与 RelatedFactory 自动生成关联数据。同时演示 pytest 的 fixture 作用域与参数化,实现一个 Scenario 类来封装典型业务场景(如“已付款未发货订单”)。
import factory
from myapp.models import Order, User
class UserFactory(factory.django.DjangoModelFactory):
class Meta:
model = User
username = factory.Faker('user_name')
email = factory.LazyAttribute(lambda o: f'{o.username}@test.com')
class OrderFactory(factory.django.DjangoModelFactory):
class Meta:
model = Order
user = factory.SubFactory(UserFactory)
total = factory.Faker('pydecimal', left_digits=5, right_digits=2)
status = 'pending'