简约、独立且无依赖的假数据生成器。
项目描述
简约、独立且无依赖的假数据生成器。
fake.py 是一个独立、便携的库,用于为测试生成各种随机数据类型。
它提供了一个简化且无依赖的替代方案,用于创建随机文本、(人)名、URL、日期、文件名、IP、原始Python数据类型(如 uuid、str、int、float、bool)、GEO数据(如城市、国家、地理位置、国家代码、纬度、经度)以及多种文件格式的字节内容,包括 PDF、DOCX、ODT、PNG、SVG、BMP、GIF、TIF、PPM、WAV、ZIP、TAR 和 EML。
该软件包还支持在文件系统中创建文件,并包括与 Django、TortoiseORM、Pydantic 和 SQLAlchemy 兼容的工厂(动态固定值)(这意味着它与 SQLModel 也兼容)。
功能
生成随机文本、(人物)姓名、电子邮件、URL、日期、IP和原始Python数据类型。
支持各种文件格式(PDF、DOCX、ODT、TXT、PNG、SVG、BMP、GIF、TIF、PPM、WAV、ZIP、TAR、EML)以及在文件系统上创建文件。
基本工厂,用于与Django、Pydantic、TortoiseORM和SQLAlchemy集成。
命令行界面(CLI),用于从命令行生成数据。
先决条件
Python 3.9+
安装
pip
pip install fake.py
下载并复制
fake.py是该包的唯一、独立的模块。它还包括测试。如果您觉得更方便,可以简单下载fake.py模块并将其包含在您的仓库中。
由于包含测试,它不会对您的测试覆盖率产生负面影响(您可能需要调整覆盖率配置)。
文档
用法
生成数据
人物姓名
from fake import FAKER
FAKER.first_name() # str
FAKER.first_names() # list[str]
FAKER.last_name() # str
FAKER.last_names() # list[str]
FAKER.name() # str
FAKER.names() # list[str]
FAKER.username() # str
FAKER.usernames() # list[str]
随机文本
from fake import FAKER
FAKER.password() # str
FAKER.paragraph() # str
FAKER.paragraphs() # list[str]
FAKER.sentence() # str
FAKER.sentences() # list[str]
FAKER.slug() # str
FAKER.slugs() # list[str]
FAKER.text() # str
FAKER.texts() # list[str]
FAKER.word() # str
FAKER.words() # list[str]
互联网
from fake import FAKER
FAKER.company_email() # str
FAKER.domain_name() # str
FAKER.email() # str
FAKER.free_email() # str
FAKER.free_email_domain() # str
FAKER.image_url() # str
FAKER.ipv4() # str
FAKER.tld() # str
FAKER.url() # str
文件名
from fake import FAKER
FAKER.file_extension() # str
FAKER.file_name() # str
FAKER.mime_type() # str
原始数据类型
from fake import FAKER
FAKER.pybool() # bool
FAKER.pyfloat() # flot
FAKER.pyint() # int
FAKER.pystr() # str
FAKER.uuid() # uuid.UUID
日期
from fake import FAKER
FAKER.date() # datetime.date
FAKER.date_time() # datetime.datetime
地理数据
from fake import FAKER
FAKER.city() # str
FAKER.country() # str
FAKER.geo_location() # str
FAKER.country_code() # str
FAKER.locale() # str
FAKER.latitude() # float
FAKER.longitude() # float
FAKER.latitude_longitude() # tuple[float, float]
书籍
from fake import FAKER
FAKER.isbn10() # str
FAKER.isbn13() # str
银行
from fake import FAKER
FAKER.iban() # str
生成文件
作为字节
from fake import FAKER
FAKER.bmp() # bytes
FAKER.docx() # bytes
FAKER.eml() # bytes
FAKER.gif() # bytes
FAKER.odt() # bytes
FAKER.pdf() # bytes
FAKER.png() # bytes
FAKER.ppm() # bytes
FAKER.svg() # bytes
FAKER.tar() # bytes
FAKER.tif() # bytes
FAKER.wav() # bytes
FAKER.zip() # bytes
作为文件系统上的文件
from fake import FAKER
FAKER.bmp_file() # str
FAKER.docx_file() # str
FAKER.eml_file() # str
FAKER.gif_file() # str
FAKER.odt_file() # str
FAKER.pdf_file() # str
FAKER.png_file() # str
FAKER.ppm_file() # str
FAKER.svg_file() # str
FAKER.tar_file() # str
FAKER.tif_file() # str
FAKER.txt_file() # str
FAKER.wav_file() # str
FAKER.zip_file() # str
工厂/动态固定值
这是如何为Django的内置Group和User模型定义工厂的方法。
文件名:factories.py
from django.contrib.auth.models import Group, User
from fake import (
DjangoModelFactory,
FACTORY,
PostSave,
PreSave,
trait,
)
class GroupFactory(DjangoModelFactory):
"""Group factory."""
name = FACTORY.word()
class Meta:
model = Group
get_or_create = ("name",)
def set_password(user: User, password: str) -> None:
"""Helper function for setting password for the User."""
user.set_password(password)
def add_to_group(user: User, name: str) -> None:
"""Helper function for adding the User to a Group."""
group = GroupFactory(name=name)
user.groups.add(group)
class UserFactory(DjangoModelFactory):
"""User factory."""
username = FACTORY.username()
first_name = FACTORY.first_name()
last_name = FACTORY.last_name()
email = FACTORY.email()
date_joined = FACTORY.date_time()
last_login = FACTORY.date_time()
is_superuser = False
is_staff = False
is_active = FACTORY.pybool()
password = PreSave(set_password, password="test1234")
group = PostSave(add_to_group, name="Test group")
class Meta:
model = User
get_or_create = ("username",)
@trait
def is_admin_user(self, instance: User) -> None:
"""Trait."""
instance.is_superuser = True
instance.is_staff = True
instance.is_active = True
以下是使用它的方法
# Create just one user
user = UserFactory()
# Create 5 users
users = UserFactory.create_batch(5)
# Create a user using `is_admin_user` trait
user = UserFactory(is_admin_user=True)
# Create a user with custom password
user = UserFactory(
password=PreSave(set_password, password="another-password"),
)
# Add a user to another group
user = UserFactory(
group=PostSave(add_to_group, name="Another group"),
)
# Or even add user to multiple groups at once
user = UserFactory(
group_1=PostSave(add_to_group, name="Another group"),
group_2=PostSave(add_to_group, name="Yet another group"),
)
自定义
创建自己的自定义提供者,并利用它们使用工厂。
文件名:custom_fake.py
import random
import string
from fake import Faker, Factory, provider
class CustomFaker(Faker):
@provider
def postal_code(self) -> str:
number_part = "".join(random.choices(string.digits, k=4))
letter_part = "".join(random.choices(string.ascii_uppercase, k=2))
return f"{number_part} {letter_part}"
FAKER = CustomFaker()
FACTORY = Factory(FAKER)
现在您可以使用它如下(请确保导入您的自定义FAKER和FACTORY实例)
from custom_fake import FAKER # Custom `FAKER` instance
FAKER.postal_code()
或如下
from fake import ModelFactory
from custom_fake import FACTORY # Custom `FACTORY` instance
class AddressFactory(ModelFactory):
# ... other definitions
postal_code = FACTORY.postal_code()
# ... other definitions
class Meta:
model = Address
测试
使用unittest运行测试
python -m unittest fake.py
或pytest
pytest
与替代方案的区别
fake.py 是一个打包了 Faker、factory_boy 和 faker-file 的工具,功能大幅简化,减少了特性,但没有任何外部依赖(甚至不包括 Pillow 或 dateutil)。
fake.py 的设计灵感来源于著名的 Faker 包。它的 API 与 Faker 兼容性很高,尽管功能大幅减少。它不支持多语言,也不支持邮政编码或许多 RAW 文件格式。然而,您可以轻松地将它集成到生产环境中,无需担心额外的依赖。
另一方面,fake.py 的工厂看起来与 factory_boy 的工厂非常相似,尽管功能再次大幅简化。
fake.py 的文件生成部分模仿了 faker-file。您不会获得大量支持的文件类型,并且对生成文件的内容的控制也不多,但您会得到无依赖的有效文件,如果您只需要这些,那么您不需要再寻找其他工具。
然而,如果您在任何时候发现“需要更多”,可以选择使用 Faker、factory_boy 和 faker-file 的组合。
编写文档
请保持以下层次结构。
=====
title
=====
header
======
sub-header
----------
sub-sub-header
~~~~~~~~~~~~~~
sub-sub-sub-header
^^^^^^^^^^^^^^^^^^
sub-sub-sub-sub-header
++++++++++++++++++++++
sub-sub-sub-sub-sub-header
**************************
许可
MIT
支持
有关安全问题,请联系作者部分提供的电子邮件。
有关总体问题,请访问 GitHub。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。