标签归档:test-data-generator

Faker-Faker是为您生成假数据的Python包

费克是为您生成假数据的Python包。无论您需要引导数据库、创建好看的XML文档、填充持久性以对其进行压力测试,还是需要匿名从生产服务获取的数据,Faker都适合您

Faker的灵感主要来自于PHP FakerPerl Faker,并按Ruby Faker

兼容性

从版本开始4.0.0Faker已删除对Python 2及更高版本的支持5.0.0仅支持Python 3.6及更高版本。如果您仍然需要与Python 2兼容,请安装版本3.0.1同时,请考虑更新您的代码库以支持Python3,这样您就可以享受最新的功能Faker必须提供。请参阅extended docs有关更多详细信息,特别是当您要从版本升级时2.0.4和下面,因为可能会有突破性的变化

这个包以前也被称为fake-factory在2016年底已经被弃用,并且从那时起发生了很多变化,所以请确保您的项目及其依赖项不依赖于旧的包

基本用法

使用pip安装:

pip install Faker

使用faker.Faker()创建并初始化伪造器生成器,该生成器可以通过访问以所需数据类型命名的属性来生成数据

from faker import Faker
fake = Faker()

fake.name()
# 'Lucy Cechtelar'

fake.address()
# '426 Jordy Lodge
#  Cartwrightshire, SC 88120-6700'

fake.text()
# 'Sint velit eveniet. Rerum atque repellat voluptatem quia rerum. Numquam excepturi
#  beatae sint laudantium consequatur. Magni occaecati itaque sint et sit tempore. Nesciunt
#  amet quidem. Iusto deleniti cum autem ad quia aperiam.
#  A consectetur quos aliquam. In iste aliquid et aut similique suscipit. Consequatur qui
#  quaerat iste minus hic expedita. Consequuntur error magni et laboriosam. Aut aspernatur
#  voluptatem sit aliquam. Dolores voluptatum est.
#  Aut molestias et maxime. Fugit autem facilis quos vero. Eius quibusdam possimus est.
#  Ea quaerat et quisquam. Deleniti sunt quam. Adipisci consequatur id in occaecati.
#  Et sint et. Ut ducimus quod nemo ab voluptatum.'

每次调用方法fake.name()产生不同的(随机)结果。这是因为冒牌者转发faker.Generator.method_name()呼叫至faker.Generator.format(method_name)

for _ in range(10):
  print(fake.name())

# 'Adaline Reichel'
# 'Dr. Santa Prosacco DVM'
# 'Noemy Vandervort V'
# 'Lexi O'Conner'
# 'Gracie Weber'
# 'Roscoe Johns'
# 'Emmett Lebsack'
# 'Keegan Thiel'
# 'Wellington Koelpin II'
# 'Ms. Karley Kiehn V'

最热灯具

Faker也有自己的pytest该插件提供了一个faker您可以在测试中使用的灯具。请查看最火爆的夹具文档以了解更多信息

提供商

每个生成器属性(如nameaddress,以及lorem)被称为“假的”。一个伪造者生成器有许多伪造者,打包在“提供者”中。

from faker import Faker
from faker.providers import internet

fake = Faker()
fake.add_provider(internet)

print(fake.ipv4_private())

检查extended docs有关以下内容的列表bundled providers以及一份community providers

本地化

faker.Faker可以将区域设置作为参数,以返回本地化数据。如果未找到本地化提供程序,工厂将回退到默认的en_US区域设置

from faker import Faker
fake = Faker('it_IT')
for _ in range(10):
    print(fake.name())

# 'Elda Palumbo'
# 'Pacifico Giordano'
# 'Sig. Avide Guerra'
# 'Yago Amato'
# 'Eustachio Messina'
# 'Dott. Violante Lombardo'
# 'Sig. Alighieri Monti'
# 'Costanzo Costa'
# 'Nazzareno Barbieri'
# 'Max Coppola'

faker.Faker还支持多个区域设置。v3.0.0中的新功能

from faker import Faker
fake = Faker(['it_IT', 'en_US', 'ja_JP'])
for _ in range(10):
    print(fake.name())

# 鈴木 陽一
# Leslie Moreno
# Emma Williams
# 渡辺 裕美子
# Marcantonio Galuppi
# Martha Davis
# Kristen Turner
# 中津川 春香
# Ashley Castillo
# 山田 桃子

您可以在提供程序包下的源代码中检查可用的Faker区域设置。Faker的本地化是一个持续的过程,我们需要您的帮助。请毫不犹豫地为您自己的区域设置创建本地化提供程序并提交拉取请求(PR)

优化

Faker构造函数接受与性能相关的参数,称为use_weighting它指定是否尝试使值的频率与实际频率匹配(例如,英文名称Gary会比名称Lormer频繁得多)。如果use_weightingFalse,那么所有项目被选中的机会都是相等的,并且选择过程要快得多。默认值为True

命令行用法

安装后,您可以从命令行调用faker:

faker [-h] [--version] [-o output]
      [-l {bg_BG,cs_CZ,...,zh_CN,zh_TW}]
      [-r REPEAT] [-s SEP]
      [-i {package.containing.custom_provider otherpkg.containing.custom_provider}]
      [fake] [fake argument [fake argument ...]]

其中:

  • faker:是安装在您的环境中的脚本,在开发中您可以使用python -m faker取而代之的是
  • -h--help:显示帮助消息
  • --version:显示程序的版本号
  • -o FILENAME:将输出重定向到指定的文件名
  • -l {bg_BG,cs_CZ,...,zh_CN,zh_TW}:允许使用本地化提供程序
  • -r REPEAT:将生成指定数量的输出
  • -s SEP:将在每次生成的输出后生成指定的分隔符
  • -i {my.custom_provider other.custom_provider}要使用的其他自定义提供程序的列表。请注意,这是包含提供程序类的包的导入路径,而不是自定义提供程序类本身
  • fake:是要为其生成输出的伪对象的名称,如nameaddress,或text
  • [fake argument ...]:要传递给假的可选参数(例如,配置文件假以逗号分隔的字段名称的可选列表作为第一个参数)

示例:

$ faker address
968 Bahringer Garden Apt. 722
Kristinaland, NJ 09890

$ faker -l de_DE address
Samira-Niemeier-Allee 56
94812 Biedenkopf

$ faker profile ssn,birthdate
{'ssn': u'628-10-1085', 'birthdate': '2008-03-29'}

$ faker -r=3 -s=";" name
Willam Kertzmann;
Josiah Maggio;
Gayla Schmitt;

如何创建提供程序

from faker import Faker
fake = Faker()

# first, import a similar Provider or use the default one
from faker.providers import BaseProvider

# create new provider class
class MyProvider(BaseProvider):
    def foo(self):
        return 'bar'

# then add new provider to faker instance
fake.add_provider(MyProvider)

# now you can use:
fake.foo()
# 'bar'

如何自定义Lorem提供程序

如果您不想使用默认的lorem ipsum,您可以提供您自己的词组。下面的示例说明如何使用从cakeipsum

from faker import Faker
fake = Faker()

my_word_list = [
'danish','cheesecake','sugar',
'Lollipop','wafer','Gummies',
'sesame','Jelly','beans',
'pie','bar','Ice','oat' ]

fake.sentence()
# 'Expedita at beatae voluptatibus nulla omnis.'

fake.sentence(ext_word_list=my_word_list)
# 'Oat beans oat Lollipop bar cheesecake.'

如何与工厂男孩一起使用

Factory Boy已经与集成了Faker只需使用factory.Faker一种方法factory_boy

import factory
from myapp.models import Book

class BookFactory(factory.Factory):
    class Meta:
        model = Book

    title = factory.Faker('sentence', nb_words=4)
    author_name = factory.Faker('name')

访问随机实例

这个.random属性返回random.Random用于生成值:

from faker import Faker
fake = Faker()
fake.random
fake.random.getstate()

默认情况下,所有生成器共享相同的random.Random,可以通过以下方式访问from faker.generator import random对于想要影响所有赝品实例的插件来说,使用此选项可能很有用

唯一值

通过使用.unique属性,则可以保证生成的任何值对于此特定实例都是唯一的

from faker import Faker
fake = Faker()
names = [fake.unique.first_name() for i in range(500)]
assert len(set(names)) == len(names)

呼叫fake.unique.clear()清除已看到的值。注意,为了避免无限循环,在多次尝试查找唯一值之后,Faker将抛出UniquenessException当心birthday
paradox
,碰撞的可能性比你想象的要大

from faker import Faker

fake = Faker()
for i in range(3):
     # Raises a UniquenessException
     fake.unique.boolean()

此外,只有可散列的参数和返回值可以与一起使用.unique

设定发电机种子

在使用Faker进行单元测试时,您通常希望生成相同的数据集。为方便起见,生成器还提供了seed()方法,该方法为共享随机数生成器设定种子。使用相同版本的faker和Seed调用相同的方法会产生相同的结果

from faker import Faker
fake = Faker()
Faker.seed(4321)

print(fake.name())
# 'Margaret Boehm'

每个生成器还可以切换到其自己的random.Random,与共享文件分开,方法是使用seed_instance()方法,该方法的作用与此相同。例如:

from faker import Faker
fake = Faker()
fake.seed_instance(4321)

print(fake.name())
# 'Margaret Boehm'

请注意,由于我们不断更新数据集,因此不能保证不同补丁版本之间的结果是一致的。如果在测试中硬编码结果,请确保已将Faker一直到补丁编号

如果您使用的是pytest,您可以将faker通过定义一个faker_seed固定装置。请查看最火爆的夹具文档以了解更多信息

测试

运行测试:

$ tox

为提供商编写文档:

$ python -m faker > docs.txt

贡献力量

请看CONTRIBUTING

许可证

Faker根据麻省理工学院的许可获释。请参阅捆绑的LICENSE有关详细信息,请参阅文件

学分