Узнайте, как генерировать случайные данные для тестирования ваших приложений с помощью библиотеки Python faker.
Очень часто при создании приложений возникает ситуация, когда нам нужны данные для тестирования различных функциональных возможностей.
Чтобы решить эту проблему и работать с более разнообразными и реалистичными данными, изобретательные разработчики создали библиотеку Faker, которая может генерировать все типы случайных данных.
Содержание
Установка и первые шаги
Чтобы установить Faker мы используем pip :
pip install Faker
Затем мы можем очень легко начать генерировать случайные данные, создав экземпляр класса Faker:
from faker import Faker
fake = Faker()
fake.name()
# Alexander Bell
fake.address()
# 206 Howard Grove
# East Haleyburgh, MO 00839
fake.text()
# Project bank have recently. Various before local development.
# Despite something successful next.
Code language: PHP (php)
Магия, не правда ли?
Если вам надоел английский язык, вы можете указать страну, данные из которой вы хотите генерировать, с помощью параметра locale :
from faker import Faker
fake = Faker(locale="ru_RU")
print(fake.name())
# Ильина Таисия Матвеевна
print(fake.address())
# с. Аршан (Бурят.), пер. Морской, д. 359 стр. 9/2, 932589
print(fake.text())
# Коммунизм налево жестокий совет. Зеленый выраженный ремень плавно вздрогнуть желание термин.
# Marche sauvage moАдвокат пол темнеть сустав пересечь.
Code language: PHP (php)
Примечание. Список всех значений, поддерживаемых locale, можно найти на этой странице.
Обратите внимание, что последовательные вызовы метода name каждый раз возвращают другое значение!
Простой цикл for, и мы автоматически генерируем десятки различных имен.
Генерация уникальных данных
Обычно, когда у вас есть набор данных, вы предпочитаете избегать дублирования значений.
Faker позволяет очень легко генерировать уникальные данные, помещая уникальное слово перед элементом, который вы хотите сгенерировать.
Например, если вы хотите сгенерировать 500 уникальных случайных чисел:
import faker
fake = faker.Faker()
for _ in range(500):
print(fake.unique.random_int())
Code language: JavaScript (javascript)
Если вы мне не верите, можно проверить, что длина списка такая же, как у списка в формате set (set не допускают дублирования значений):
import faker
fake = faker.Faker()
numbers = [fake.unique.random_int() for _ in range(500)]
assert len(numbers) == len(set(numbers)) # Никогда
Code language: JavaScript (javascript)
Если вы генерируете слишком много данных, Faker не сможет гарантировать их уникальность.
Например, если вы попытаетесь сгенерировать 50 000 случайных имен, то в итоге получите дубликаты.
Faker предупредит вас о дубликатах, выбросив исключение UniquenessException:
from faker import Faker
fake = Faker()
for _ in range(50000):
print(fake.unique.first_name())
# После 1000 итераций мы получаем ошибку
# faker.exceptions.UniquenessException: Got duplicated values after 1,000 iterations.
Code language: PHP (php)
База данных имен содержит не более 1000 уникальных значений, поэтому если вы попытаетесь сгенерировать 50 000, вы достигнете предела после 1000 итераций.
Несколько интересных наборов данных
Faker имеет множество “провайдеров“, которые позволяют генерировать случайные данные.
Количество данных, поддерживаемых библиотекой, действительно впечатляет.
Вот несколько примеров:
Генерация названий профессий.
from faker import Faker
fake = Faker(locale="ru_RU")
for _ in range(10):
print(fake.job())
#Модель
#Официант
#Столяр
#Фотомодель
#Оператор вооружения
#Борт-радист
#Бактериолог
#Искусствовед
#Педиатр
#Стоматолог
Code language: PHP (php)
file_path для генерации путей к файлам :
from faker import Faker
fake = Faker()
for _ in range(5):
print(fake.file_path())
#/day/today.flac
#/service/remember.numbers
#/put/enter.tiff
#/off/beautiful.mov
#/bar/easy.mov
Code language: PHP (php)
Обратите внимание, что каждый провайдер принимает ряд параметров, которые позволяют получить более точные данные.
Для файлов, например, можно указать количество подпапок и категорию (тип) файлов, которые вам нужны:
from faker import Faker
fake = Faker()
for _ in range(5):
print(fake.file_path(depth=5, category='video'))
#/we/life/rich/camera/close/military.avi
#/minute/law/too/exactly/business/owner.mp4
#/necessary/glass/us/health/how/win.webm
#/front/opportunity/modern/without/heavy/operation.mp4
#/paper/skill/or/thank/similar/admit.webm
Code language: PHP (php)
credit_card для генерации номеров кредитных карт, включая credit_card_expire, credit_card_number и credit_card_security_code :
from faker import Faker
fake = Faker()
for _ in range(5):
print(fake.credit_card_number(), fake.credit_card_expire(), fake.credit_card_security_code())
#2276100071207873 05/27 943
#4604762528318 04/31 730
#4486920584813202 07/26 963
#639004489600 08/25 809
#4702554979960 01/25 464
Code language: PHP (php)
К сожалению, эти кредитные карты не позволяют совершать онлайн-покупки :-).
С помощью hex_color или rgb_color вы можете генерировать случайные цвета:
from faker import Faker
fake = Faker()
for _ in range(5):
print(fake.rgb_color())
# 205,49,136
# 32,160,130
# 255,178,40
# 41,123,122
# 100,48,43
from faker import Faker
fake = Faker()
for _ in range(5):
print(fake.hex_color())
# #266358
# #1ce6a2
# #a35cd1
# #fa9f1b
# #aa0b21
Code language: PHP (php)
Генерация конкретных данных
Иногда нужно быть немного более конкретным и генерировать случайные данные, которые соответствуют определенному формату.
Если вы, например, создаете приложение для управления складскими запасами книжного магазина, вам, вероятно, потребуется генерировать определенные номера ISBN (идентификационные номера книг).
Существует провайдер для создания данных ISBN, но не все случаи из всех стран учитываются.
Представьте, что вам нужно сгенерировать случайный номер ISBN в такой форме:
'978-2-5351-3933-554-23'
Code language: JavaScript (javascript)
Класс BaseProvider позволяет генерировать случайные последовательности, которые следуют определенному формату.
Метод numerify, например, позволяет использовать определенные символы по номерам. Символ # будет заменен на число от 0 до 9. Символ % будет заменен на число от 1 до 9.
Вы можете сгенерировать случайный ISBN следующим образом:
from faker import Faker
fake = Faker()
for _ in range(5):
print(fake.numerify(text='%%%-%-%%%%-%%%%-%%%-%%'))
# 568-1-3152-1486-157-28
# 775-4-4936-7785-358-32
# 649-2-5754-9224-327-61
# 712-6-8111-1927-199-59
# 555-2-3311-4633-725-18
Code language: PHP (php)
Нужно генерировать случайные артикулы? Легко с bothify :
from faker import Faker
fake = Faker()
for _ in range(5):
print(fake.bothify(text='Артикул: ????-########'))
# Артикул: LEnd-92786420
# Артикул: XGFW-14616317
# Артикул: zWMP-16845523
# Артикул: SAxo-14205482
# Артикул: cwwt-23855798
Code language: PHP (php)
Заключение
Как вы можете видеть, эта библиотека действительно весьма продвинута и позволит вам генерировать все типы данных, необходимые для наших тестов.