faker (python) 在 shell 中随机化,但不在 DjangoModelFactory 对象中
faker (python) randomizes in shell, but not in DjangoModelFactory object
我有一些使用faker(http://www.joke2k.net/faker/)进行单元测试的模型,它在shell中是随机的:
In [50]: get_random()
Out[50]: 22347376
In [51]: get_random()
Out[51]: 66840240
In [52]: import factory, random, time
In [53]: from factory import DjangoModelFactory, lazy_attribute
In [54]: from faker import Faker
In [55]: FAKER = Faker(locale='en_US')
In [60]: FAKER.email()
Out[60]: u'anderson.meaghan@jonesharvey.org'
In [61]: FAKER.seed(get_random())
In [62]: FAKER.email()
Out[62]: u'ubeatty@gmail.com'
In [63]: FAKER.seed(get_random())
In [64]: FAKER.email()
Out[64]: u'klocko.martha@gmail.com'
In [65]: FAKER.email()
Out[65]: u'lebsack.zela@homenick.info'
In [66]: FAKER.email()
Out[66]: u'lance90@bauch.com'
播种是可选的。但是当我制作一个新对象时,我总是得到它制作了相同的电子邮件:
In [2]: u = User()
In [3]: u
Out[3]: <User: Ut fugiat quasi aperiam provident error iure. Enim dolor totam quia sint. Porro laudantium aut non ducimus veritatis.>
In [5]: u.email
Out[5]: 'Alfie_Lemke@example.com'
In [6]: u = User()
IntegrityError: duplicate key value violates unique constraint "users_user_email_key"
DETAIL: Key (email)=(Alfie_Lemke@example.com) already exists.
模型看起来像:
../users.py:
import factory, time
from factory import DjangoModelFactory, lazy_attribute
from faker import Faker
FAKER = Faker(locale='en_US')
class User(DjangoModelFactory):
class Meta:
model = 'users.User'
first_name = FAKER.first_name()
last_name = FAKER.last_name()
email = FAKER.email()
现在我有:
import factory, random, time
from factory import DjangoModelFactory, lazy_attribute
from faker import Faker
FAKER = Faker(locale='en_US')
def get_random():
return int((random.SystemRandom(random.seed()).random())*100000000)
class User(DjangoModelFactory):
class Meta:
model = 'users.User'
FAKER.seed(get_random())
first_name = FAKER.first_name()
last_name = FAKER.last_name()
email = FAKER.email()
这没什么区别。某些东西如何在 shell 中随机化,但即使喂食种子也不会在对象创建时随机化?谢谢
查看你的工厂,你正在将你的属性设置为对 faker 的调用,而不是将它们设置为 lazy_attributes。在您的工厂中(我强烈建议将其命名为 UserFactory 或类似名称以防止与您的 users.User 模型混淆),声明您的属性,如下所示:
import factory
from factory import DjangoModelFactory, lazy_attribute
from faker import Faker
FAKER = Faker(locale='en_US')
class User(DjangoModelFactory):
class Meta:
model = 'users.User'
first_name = lazy_attribute(lambda x: FAKER.first_name())
last_name = lazy_attribute(lambda x: FAKER.last_name())
email = lazy_attribute(lambda x: FAKER.email())
此更改将导致您的工厂在每次执行时调用您的 Faker,而不仅仅是在工厂初始化时。如果你正在尝试生成你想要查看特定值的测试数据,你可以使用初始化 Faker 的 seed()
方法来确保你的数据每次都开始相同(例如生成 3 个人会始终给出 "John Smith",然后是 "Jane Doe",然后是 "Joe Blow"),以防您专门测试数据中的这些名称。
最后,您提供的 link to faker 看起来像是转到了作者的博客,但您可以在 readthedocs.
找到该存储库的综合文档
我有一些使用faker(http://www.joke2k.net/faker/)进行单元测试的模型,它在shell中是随机的:
In [50]: get_random()
Out[50]: 22347376
In [51]: get_random()
Out[51]: 66840240
In [52]: import factory, random, time
In [53]: from factory import DjangoModelFactory, lazy_attribute
In [54]: from faker import Faker
In [55]: FAKER = Faker(locale='en_US')
In [60]: FAKER.email()
Out[60]: u'anderson.meaghan@jonesharvey.org'
In [61]: FAKER.seed(get_random())
In [62]: FAKER.email()
Out[62]: u'ubeatty@gmail.com'
In [63]: FAKER.seed(get_random())
In [64]: FAKER.email()
Out[64]: u'klocko.martha@gmail.com'
In [65]: FAKER.email()
Out[65]: u'lebsack.zela@homenick.info'
In [66]: FAKER.email()
Out[66]: u'lance90@bauch.com'
播种是可选的。但是当我制作一个新对象时,我总是得到它制作了相同的电子邮件:
In [2]: u = User()
In [3]: u
Out[3]: <User: Ut fugiat quasi aperiam provident error iure. Enim dolor totam quia sint. Porro laudantium aut non ducimus veritatis.>
In [5]: u.email
Out[5]: 'Alfie_Lemke@example.com'
In [6]: u = User()
IntegrityError: duplicate key value violates unique constraint "users_user_email_key"
DETAIL: Key (email)=(Alfie_Lemke@example.com) already exists.
模型看起来像:
../users.py:
import factory, time
from factory import DjangoModelFactory, lazy_attribute
from faker import Faker
FAKER = Faker(locale='en_US')
class User(DjangoModelFactory):
class Meta:
model = 'users.User'
first_name = FAKER.first_name()
last_name = FAKER.last_name()
email = FAKER.email()
现在我有:
import factory, random, time
from factory import DjangoModelFactory, lazy_attribute
from faker import Faker
FAKER = Faker(locale='en_US')
def get_random():
return int((random.SystemRandom(random.seed()).random())*100000000)
class User(DjangoModelFactory):
class Meta:
model = 'users.User'
FAKER.seed(get_random())
first_name = FAKER.first_name()
last_name = FAKER.last_name()
email = FAKER.email()
这没什么区别。某些东西如何在 shell 中随机化,但即使喂食种子也不会在对象创建时随机化?谢谢
查看你的工厂,你正在将你的属性设置为对 faker 的调用,而不是将它们设置为 lazy_attributes。在您的工厂中(我强烈建议将其命名为 UserFactory 或类似名称以防止与您的 users.User 模型混淆),声明您的属性,如下所示:
import factory
from factory import DjangoModelFactory, lazy_attribute
from faker import Faker
FAKER = Faker(locale='en_US')
class User(DjangoModelFactory):
class Meta:
model = 'users.User'
first_name = lazy_attribute(lambda x: FAKER.first_name())
last_name = lazy_attribute(lambda x: FAKER.last_name())
email = lazy_attribute(lambda x: FAKER.email())
此更改将导致您的工厂在每次执行时调用您的 Faker,而不仅仅是在工厂初始化时。如果你正在尝试生成你想要查看特定值的测试数据,你可以使用初始化 Faker 的 seed()
方法来确保你的数据每次都开始相同(例如生成 3 个人会始终给出 "John Smith",然后是 "Jane Doe",然后是 "Joe Blow"),以防您专门测试数据中的这些名称。
最后,您提供的 link to faker 看起来像是转到了作者的博客,但您可以在 readthedocs.
找到该存储库的综合文档