【问题标题】:Django - Create random dummy data for testing that doesn't break the test suiteDjango - 为不会破坏测试套件的测试创建随机虚拟数据
【发布时间】:2022-01-25 09:30:44
【问题描述】:

我正在想办法为运行python manage.py test 创建某种模型类型的随机测试数据。例如,如果我有一个模型Post,如下所示。

model.py

class Post(models.Model):
    uuid = models.UUIDField(primary_key=True)
    created = models.DateTimeField('Created at', auto_now_add=True)
    updated_at = models.DateTimeField('Last updated at', auto_now=True, blank=True, null=True)
    creator = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name="post_creator")
    body = models.CharField(max_length=POST_MAX_LEN, validators=[MinLengthValidator(POST_MIN_LEN)])

某种库会用用户表中的随机body、随机creator 生成它会很好。我试过factory boy,但是当测试数据库在测试函数之后回滚数据库时,即使它在setUpTestData函数中声明,它似乎也回滚了工厂男孩创建的虚拟数据。此回滚过程会导致约束错误,因为原始数据不再存在。 有什么好的库或方法可以为 Django 测试创建不破坏测试套件的虚拟数据?

dummy_factory.py

from factory.django import DjangoModelFactory

class PostFactory(DjangoModelFactory):
    class Meta:
        model = Post

    creator = factory.Iterator(User.objects.all())
    body = factory.Faker('text')

注意:
另一种选择是创建一个函数,比如说make_dummy_post,它使用Post.objects.create(),随机采样User,并使用工厂男孩生成器生成body,但我觉得有比这更好的方法。

【问题讨论】:

    标签: python django factory-boy


    【解决方案1】:

    首先pip install model_bakery,然后:

    from model_bakery import baker
    
    
    # app_name.model_name
    model_obj = baker.make("post.Post")
    

    这里是[docs]了解更多信息。

    【讨论】:

    • model_bakeryfactory boy 之间的主要区别是什么?似乎factory boy 更多地用于在您的数据库上创建虚拟数据以测试 API 调用,而根据他们的文档,model_bakery 用于测试。在幕后,是什么让一个用于测试和一个用于创建虚拟数据?
    • 因为人们通常为测试而不是生产创建数据,所以它们有点相同,但我发现model_bakery 更容易使用。
    • 我最担心的是遇到了factory boy 的问题,即初始数据生成中的问题。 factory boy 创建的任何数据都会在测试函数结束时回滚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多