【问题标题】:Issue with duplicate values generated when using factory_boy and randint使用 factory_boy 和 randint 时生成重复值的问题
【发布时间】:2019-08-11 18:30:52
【问题描述】:

我看到在使用 randint 和 factory_boy 时生成了重复值。检查每个对象的资产时,我的测试失败。在工厂调用 create() 时,两者的条形码也是相同的。

是否需要在创建每个对象之前提供不同的种子?

  • 工厂男孩 2.11.1
  • Faker 1.0.4
  • python 2.7
  • django 1.11

文件

seed/factories.py

import factory
from A1.models import *
from random import randint, random
faker = Factory.create()

class AssetFactory(factory.DjangoModelFactory):

    class Meta:
        model = Asset

asset = "ABC" + str(randint(0000, 9999))
barcode = "AA" + randint(111111, 999999)
user = factory.lazy_attribute(lambda x: faker.name())

tests.py

def test_randomCreation(self):
    new_asset = AssetFactory.create()
    new_asset2 = AssetFactory.create()
    self.assertNotEqual(new_asset.asset, new_asset2.asset)  #FAILS

A1/models.py

class Asset(models.Model):
    asset =  models.CharField(max_length=255, verbose_name="Asset")
    barcode = models.CharField(max_length=255)
    user = models.CharField(max_length=255)

有人可以指出我正确的方向吗? 提前致谢!!

【问题讨论】:

    标签: python-2.7 faker django-1.11 factory-boy


    【解决方案1】:

    Python 语言的设计方式,你的代码无法运行。

    严格等价于:

    _RANDOM_ASSET = "ABC" + str(randint(0000, 9999))
    _RANDOM_BARCODE = "AA" + str(randint(111111, 999999))
    
    class AssetFactory(factory.django.DjangoModelFactory):
        class Meta:
            model = models.Asset
        asset = _RANDOM_ASSET
        barcode = _RANDOM_BARCODE
        user = factory.LazyAttribute(lambda x: faker.name())
    

    您已为 assetbarcode 固定了一个随机值,因此通过该工厂生成的每个对象都将具有完全相同的值。

    正确的方法是使用各种内置声明:

    class AssetFactory(factory.django.DjangoModelFactory):
        class Meta:
            model = models.Asset
    
        asset = factory.fuzzy.FuzzyText(length=4, prefix='ABC', chars=string.digits)
        barcode = factory.fuzzy.FuzzyText(length=6, prefix='AA', chars=string.digits)
        user = factory.Faker('name')
    

    【讨论】:

    • 谢谢!我还尝试了以下方法并且它有效:barcode = factory.LazyAttribute(lambda x: "ABC" + str(randint(111111, 999999)) 但是,我不确定我是否应该以这种方式使用它。有没有无论哪种方式都有好处吗?factoryboy.readthedocs.io/en/latest/… 的注释“LazyAttribute 调用函数,并将对象构造为参数”
    • @AeroChocolate 通过FuzzyText 的主要优点是它使用“托管”随机种子;如果您希望能够重现基于随机的测试,这一点很重要。详情请见factoryboy.readthedocs.io/en/latest/…
    猜你喜欢
    • 2023-01-16
    • 1970-01-01
    • 2023-03-31
    • 2014-06-14
    • 1970-01-01
    • 2011-07-27
    • 2020-11-24
    • 2021-01-26
    相关资源
    最近更新 更多