Faker - пакет для создания фейковых данных для тестов

Теги: tests  pip 

pip install Faker

Доступны методы, генерирующие разные данные (имена, адреса, имейлы). Есть возможность уточнять локализацию.

Каждый вызов метода объекта добавляет новые рандомные результаты.

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

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

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

Другой вариант - передать каждому экземпляру генератора свой random.Random:

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

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

Пример использования множества локалей

from collections import OrderedDict
from faker import Faker
locales = OrderedDict([
    ('en-US', 1),
    ('en-PH', 2),
    ('ja_JP', 3),
])
fake = Faker(locales)

# Get the list of locales specified during instantiation
fake.locales

# Get the list of internal generators of this `Faker` instance
fake.factories

# Get the internal generator for 'en_US' locale
fake['en_US']

# Get the internal generator for 'en_PH' locale
fake['en_PH']

# Get the internal generator for 'ja_JP' locale
fake['ja_JP']

# Will raise a KeyError as 'en_GB' was not included
fake['en_GB']

# Set the seed value of the shared `random.Random` object
# across all internal generators that will ever be created
Faker.seed(0)

# Creates and seeds a unique `random.Random` object for
# each internal generator of this `Faker` instance
fake.seed_instance(0)

# Creates and seeds a unique `random.Random` object for
# the en_US internal generator of this `Faker` instance
fake.seed_locale('en_US', 0)

# Generate a name based on the provided weights
# en_US - 16.67% of the time (1 / (1 + 2 + 3))
# en_PH - 33.33% of the time (2 / (1 + 2 + 3))
# ja_JP - 50.00% of the time (3 / (1 + 2 + 3))
fake.name()

# Generate a name under the en_US locale
fake['en-US'].name()

# Generate a zipcode based on the provided weights
# Note: en_PH does not support the zipcode provider method
# en_US - 25% of the time (1 / (1 + 3))
# ja_JP - 75% of the time (3 / (1 + 3))
fake.zipcode()

# Generate a zipcode under the ja_JP locale
fake['ja_JP'].zipcode()

# Will raise an AttributeError
fake['en_PH'].zipcode()

# Generate a Luzon province name
# Note: only en_PH out of the three supports this provider method
fake.luzon_province()

# Generate a Luzon province name
fake['en_PH'].luzon_province()

# Will raise an AttributeError
fake['ja_JP'].luzon_province()

Есть возможность создавать объекты, уникальные на всей протяженности жизни инстанса Faker():

import faker

fake = faker.Faker()

numbers = set(fake.unique.random_int() for i in range(1000))
assert len(numbers) == 1000

Провайдеры

  • faker.providers
  • faker.providers.address
  • faker.providers.automotive
  • faker.providers.bank
  • faker.providers.barcode
  • faker.providers.color
  • faker.providers.company
  • faker.providers.credit_card
  • faker.providers.currency
  • faker.providers.date_time
  • faker.providers.file
  • faker.providers.geo
  • faker.providers.internet
  • faker.providers.isbn
  • faker.providers.job
  • faker.providers.lorem
  • faker.providers.misc
  • faker.providers.person
  • faker.providers.phone_number
  • faker.providers.profile
  • faker.providers.python
  • faker.providers.ssn
  • faker.providers.user_agent

Так-же комьюнити-бейст дополнение:

  • Airtravel
  • Biology
  • Credit Score
  • Microservice
  • Music
  • Posts
  • Vehicle
  • WebProvider
  • Wi-Fi
  • Optional

Тут информация о локализации провадеров

Провайдеров можно создавать и кастомизировать

[pytest] фикстуры

Доступны фикстуры из коробки. По умолчанию фикстура faker возвращает экземпляр Faker с областью действия сеанса, который будет использоваться во всех тестах в наборе тестов. По умолчанию для этого экземпляра используется языковой стандарт en-US, он повторно заполняется с использованием начального значения 0 перед каждым тестом, а запомненные сгенерированные значения .unique очищаются. Чтобы изменить это поведение - надо переопределить фикстуры faker_session_locale, autouse_faker_seed в conftest.py

import pytest

@pytest.fixture(scope='session', autouse=True)
def faker_session_locale():
    return ['it_IT']

@pytest.fixture(scope='session', autouse=True)
def faker_seed():
    return 12345

или так:

import pytest

@pytest.fixture(scope='session', autouse=True)
def faker_session_locale():
    return ['it_IT', 'ja_JP', 'en_US']

Подробнее о конфигурации

Смотри еще: