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

Теги: tests  pip  python 

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']

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

Смотри еще: