Как сгенерировать тестовые данные для базы за 5 минут
Генерируйте реалистичные фейковые данные (имена, emails, адреса) для тестирования без ручного заполнения. Экономит часы разработки.
Заполнять базу данных вручную перед каждым прогоном тестов — это путь к выгоранию. Скопировал «Иван Иванов», вставил в 50 строк, а потом выяснилось, что нужны уникальные email'ы и валидные номера телефонов. Генераторы фейковых данных решают эту задачу за пару минут: получаешь сотни реалистичных записей одной командой или через API.
Зачем вообще нужны фейковые данные
Тестирование на продакшен-данных — плохая идея по трём причинам. Первая: GDPR и другие законы о персональных данных не позволяют копировать реальные имена и email'ы в dev-окружение. Вторая: на продакшене может не быть нужных edge cases — пользователя с фамилией из 50 символов или email'а с кириллическим доменом. Третья: случайно отправишь тестовое письмо реальному клиенту, и привет жалобе в поддержку.
Фейковые данные покрывают все сценарии:
- Проверка валидации форм (что будет, если в поле «Имя» 255 символов?)
- Нагрузочное тестирование (нужна БД с миллионом записей)
- UI-тесты (скриншоты должны выглядеть реалистично, а не показывать «Test User 1»)
- Демо-стенды для клиентов (показываешь интерфейс с правдоподобными данными, а не абракадаброй)
Какие данные чаще всего генерируют
Стандартный набор для большинства проектов:
- Имена и фамилии — желательно с учётом локали (Джон Смит для англоязычного сайта, Алексей Петров для русскоязычного)
- Email'ы — синтаксически корректные, с разными доменами (
@gmail.com,@yandex.ru,@corporate.com) - Номера телефонов — в формате страны (+7 для России, +1 для США)
- Адреса — улица, город, индекс (для e-commerce и логистики)
- Даты — дни рождения, даты регистрации, даты заказов
- Числовые данные — цены, количество товаров, рейтинги
Для финтеха добавляются номера банковских карт (тестовые, не настоящие), для соцсетей — аватары и биографии, для блогов — случайный текст постов.
Библиотеки для разных языков
Faker.js / @faker-js/faker (JavaScript/TypeScript)
Самая популярная библиотека для Node.js. После скандала с оригинальным автором сообщество перешло на форк @faker-js/faker.
import { faker } from '@faker-js/faker';
const users = Array.from({ length: 100 }, () => ({
id: faker.string.uuid(),
name: faker.person.fullName(),
email: faker.internet.email(),
avatar: faker.image.avatar(),
birthdate: faker.date.birthdate({ min: 18, max: 65, mode: 'age' }),
address: {
street: faker.location.streetAddress(),
city: faker.location.city(),
country: faker.location.country()
}
}));
Поддерживает локализацию — меняешь faker.locale = 'ru' и получаешь русские имена.
Faker (Python)
Прямой аналог для Python-проектов. Удобен для генерации CSV или заполнения Django ORM.
from faker import Faker
fake = Faker('ru_RU')
for _ in range(100):
User.objects.create(
username=fake.user_name(),
email=fake.email(),
first_name=fake.first_name(),
last_name=fake.last_name(),
phone=fake.phone_number()
)
Другие языки
- PHP: fzaninotto/Faker (хотя разработка остановлена, всё ещё работает)
- Java: javafaker или datafaker
- Go: go-faker/faker
- Ruby: faker gem
Все они работают по одному принципу: вызываешь метод, получаешь случайное значение нужного типа.
Онлайн-генераторы и API
Если не хочешь тянуть библиотеку в проект или нужно быстро сгенерировать данные для разового импорта, есть веб-инструменты.
Сценарии использования:
- QA-инженер без доступа к коду готовит CSV для импорта
- Дизайнер заполняет макет в Figma реалистичными именами
- PM создаёт демо-данные для презентации стейкхолдерам
Большинство генераторов позволяют настроить:
- Количество записей (от 10 до 10 000+)
- Поля (выбираешь нужные: имя, email, телефон, адрес)
- Формат вывода (JSON, CSV, SQL, XML)
- Локаль (русский, английский, немецкий и т.д.)
Некоторые предоставляют REST API — отправляешь GET-запрос, получаешь JSON с фейковыми данными. Удобно для автоматизации: скрипт каждый вечер пересоздаёт тестовую БД со свежими данными.
Как использовать в CI/CD
Генерация тестовых данных должна быть частью пайплайна. Типичный сценарий для Docker Compose:
services:
db:
image: postgres:15
environment:
POSTGRES_DB: testdb
POSTGRES_USER: test
POSTGRES_PASSWORD: test
seed:
build: ./seed
depends_on:
- db
command: npm run seed
Скрипт seed запускается после поднятия БД и заполняет её данными через Faker. В Dockerfile прописываешь установку зависимостей:
FROM node:18-alpine
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY seed.js ./
CMD ["node", "seed.js"]
Теперь каждый разработчик получает идентичную БД одной командой docker-compose up.
Проблемы и подводные камни
Уникальность. Генераторы могут создать дубликаты, если запрашиваешь много данных. Email'ы особенно опасны — у Faker ограниченный словарь имён. Решение: добавлять timestamp или UUID к каждому email'у.
email: `${faker.internet.userName()}.${Date.now()}@example.com`
Производительность. Генерация миллиона записей в цикле занимает время. Для больших объёмов лучше генерировать батчами по 1000 строк и использовать bulk insert.
Валидация. Faker не гарантирует, что данные пройдут бизнес-логику. Например, сгенерированный номер телефона может быть синтаксически корректным, но не существовать в реальной телефонной сети. Для критичных полей добавляй дополнительные проверки.
GDPR-совместимость. Фейковые данные всё ещё могут случайно совпасть с реальными. Если это критично (например, в медицинских системах), используй явно несуществующие домены (.test, .example) и специальные диапазоны номеров.
Инструменты для быстрого старта
Если нужно просто получить список имён, email'ов или UUID без настройки окружения, попробуй онлайн-генераторы. Генератор случайных имён создаёт реалистичные имена и фамилии для русской и английской локали — достаточно выбрать количество и скопировать результат. Для email'ов подойдёт генератор email-адресов, который создаёт валидные адреса с разными доменами. Нужны уникальные идентификаторы для каждой записи? Генератор UUID выдаст сколько угодно UUID v4 одним кликом.
Все эти инструменты работают в браузере, не требуют регистрации и позволяют экспортировать данные в нужном формате. Для разовых задач это быстрее, чем устанавливать библиотеку или писать скрипт.