Ruby

индекс
128,98

Заполнение БД тестовыми данными при помощи Populator и Faker

Часто возникает необходимость протестировать приложение на предмет работы с реальными данными. Причём, данные должны быть максимально приближены к реальным как с качественной стороны, так и с количественной. Работу по наполнению базы такими данными значительно упрощают гемы Populator и Faker.

Предположим, что у нас есть модель User:
  • email:string
  • first_name:string
  • last_name:string
  • ssn:string
  • security_question:string
  • answer:string
  • phone:string
  • address:string
  • city:string
  • state:string
  • zip:string

Чтобы сгенерировать для таблицы users 1000 тестовых пользователей, будем использовать следующий код:

require 'populator'
require 'faker'

# Populate DB with Users
User.populate(1000) do |user|
  user.email = Faker::Internet.email
  user.first_name = Faker::Name.first_name
  user.last_name = Faker::Name.last_name
  user.ssn = Faker.numerify("###-##-####")
  user.security_question = Populator.words(4..10)
  user.answer = Populator.words(1..3)
  user.phone = Faker.numerify("#"*10)
  user.address = Faker::Address.street_address
  user.city = Faker::Address.city
  user.state = Faker::Address.us_state_abbr
  user.zip = Faker::Address.zip_code
end


Следует отметить, что Populator не наследует ActiveRecord-модель, а работает с БД напрямую с целью повышения производительности. В качестве значения полей можно передавать массивы или рейнджи, Populator автоматически выберет случайное.

user.sex = ["male", "female"]
user.age = 20..30
+44
7 февраля 2010, 18:02
62

комментарии (22)

+1
mardy_bum #
Спасибо, не знал, что есть такие гемы.
Пригодится, а то у меня вечно проблемы с БД, когда с Ruby балуюсь.
+1
HeadWithoutBrains #
Попробуйте factory_girl. Мне лично приятнее работать с этим джемом. Один раз описал модельку:
Factory.define :user do |u|
u.sequence(:login) { |n| 'user_#{n}' }
u.email 'some@mail.com'
end
И вызываешь
user = Factory(:user)
или например
user = Factory(:user, :email => 'custom@mail.com')
+3
akhkharu #
Спасибо, я использую FactoryGirl для тестирования. Все-таки у Populator немного другое предназначание — быстро заполнить БД тестовыми данными. Если то же самое попробовать сделать с помощью FactoryGirl, то процесс займёт гораздо больше времени, потому что будут вызываться callback-и.
0
akzhan #
тогда уж Mechanist :)
Он как раз удобнее в сочетании с Faker, и также поддерживает не только ActiveRecord.
0
ostapbender #
А не Machinist?
0
akzhan #
Вы абсолютно правы:
ghfds/ github.com/notahat/machinist
+2
enl #
Я правильно понимаю, что Populator работает только с ActiveRecord? (а Faker не завязан на конкретном ORM) Лично я избегаю пользоваться ActiveRecord'ом, слишком неоптимизированный, более того не предоставляет разумных возможностей ручной оптимизации. В случае Datamapper ситуация обстоит лучше, но самый гибкий — Sequel.
0
akhkharu #
Да, всё верно, Populator завязан на ActiveRecord, а Faker — это просто модуль для генерации данных, ни на чём не завязан.
0
huze #
Подскажите, а есть какое-то не-Ruby решение для этого? PHP, C, не важно… Заранее спасибо. =)
+3
akhkharu #
Алтернатив Populator назвать не смогу, но точно знаю, что Faker был портирован из перловского Data::Faker (http://search.cpan.org/~jasonk/Data-Faker-0.07/).
0
huze #
Спасибо.
0
TheMengzor #
Спасибо большое! Даже как-то не задумывался над существованием подобным программ, а ведь часто необходимо наполнить рыбой БД и делаешь это ручками.
+1
VKS #
0
huze #
Во! =) Я ждал этого. Спасибо, будем играться.
0
GMile #
Спасибо, отличные плагины!
–4
squint #
Факер?
0
ognevsky #
фейкер, не?
–1
mx2000 #
Факер виз рэббитс?!
0
egorinsk #
> Следует отметить, что Populator не наследует ActiveRecord-модель, а работает с БД напрямую с целью повышения производительности.

Ага, потому что AR вообще довольно-таки непродуманная технология.
+2
Delfino #
скринкаст на тему
0
piupiu #
Оу, я удивлен что только сейчас вышел «перевод» этих знаний :-)
Просто я хочу сказать тем, кто не знал о Populate до сих пор: подпишитесь на самые «крупные» блоги посвященные рельсам. В мире RoR на быть всегда вкурсе =)
0
mac2000 #
здорово, что есть уже готовые решения, я например, как обычно, вначале сделал велосипед: code.google.com/p/generate-sql-insert-script/

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.