Как создать дополнительно 10000 пользователей в базе данных для нагрузочного тестирования?
Что проверяют
Умеете ли вы быстро и воспроизводимо наполнить базу правдоподобными данными и понимаете ли, чем вставка через API отличается от вставки напрямую в таблицу. Следом спрашивают, как потом эти данные найти и удалить и что делать с паролями.
Как отвечать
Сначала уточните, как пользователь создаётся в системе. Если регистрация тянет за собой профиль, роли и настройки, прямой INSERT в users даст неполных пользователей, и тест будет мерить не то. Тогда либо заполняете все связанные таблицы, либо создаёте через API или сервисный слой.
Если достаточно базы, варианты от быстрого к медленному:
- чистый SQL: в PostgreSQL
INSERT INTO users (...) SELECT ... FROM generate_series(1, 10000)отрабатывает за доли секунды без Python вообще; COPY: в psycopg 3 черезcursor.copy(), самый быстрый путь из кода для больших объёмов;- пакетная вставка:
psycopg2.extras.execute_values, в SQLAlchemy 2session.execute(insert(User), rows)со списком словарей, в Djangobulk_create(objs, batch_size=1000); - построчный
executeв цикле: 10 000 походов до базы, самый медленный вариант.
Данные генерирует Faker с Faker.seed(...), чтобы прогон воспроизводился, а для уникальных полей берётся fake.unique.email() или просто адрес с номером: loadtest_0001@example.com. Такой префикс заодно позволяет потом удалить всё одним запросом.
Отдельно про пароли. Захэшируйте один пароль один раз и запишите этот хэш всем 10 000 пользователям: bcrypt и argon2 специально медленные, и десять тысяч хэширований займут минуты. Нагрузочный сценарий в Locust или k6 при этом логинится известным паролем.
Где спотыкаются
Пишут в колонку пароля сгенерированный пароль открытым текстом. Логин не сработает, а если сработает, это уже дыра в безопасности.
Генерируют случайные данные без сида и без проверки уникальности. Прогон падает на UNIQUE где-то на восьмой тысяче, а повторить его в том же виде нельзя.
Забывают про статистику. После массовой вставки стоит выполнить ANALYZE, иначе планировщик какое-то время работает по старой оценке таблицы, и первые минуты теста искажают результаты.