Cómo generar contenido ficticio para tus aplicaciones
written on 09-13-2008 | comments

volcan de babelPongamos por caso que estás creando una nueva aplicación de esas que tiene un poco de todo: un blog multiusuario, por ejemplo. El layout está quedando chulo con sus listados de posts, nubes de tags y todo eso. La aplicación responde bastante rápido y todo va estupendamente.

Pero claro, en desarrollo tienes tus dos o tres usuarios de prueba y eso no se puede comparar con el gentío que tendrás funcionando el día que salgas a producción. Porque tu aplicación va a ser un exitazo, ¿verdad?

Lo mejor es que te anticipes a ese momento y compruebes qué tal responde tu aplicación una vez que tu base de datos esté bien atiborrada de contenidos. ¿Qué tal poder generarte miles de usuarios y simular que escriben cada uno unos cuantos posts, dejan comentarios, taguean contenidos, etc.?

Una idea podría ser emplear una gema que genere contenidos aleatorios. Sí, el estándar de "Lorem ipsum" mola pero resulta un poco repetitivo. Yo prefiero usar la gema Babel, que te devuelve textos de diferentes tipos: nombres de chico o de chica, apellidos, nombres de usuario, textos cortos (para líneas tipo "subject" por ejemplo), textos largos (para el cuerpo de los posts, p. ej.)...

En su día se instalaba con un simple "sudo gem install babel", pero ahora esta gema está un tanto desaparecida y ha tomado su lugar otra dedicada a la traducción de textos con Google. Buscando un poco he encontrado a la antigua Babel aquí, pero de todos modos puedes encontrar otras muchas gemas de propósito similar:

http://rubyfurnace.com/gems/babel

Bien, una vez tenemos instalada la gema con la que generamos cadenas aleatorias, nos bastará una tarea rake que se encargue de generar los contenidos. Por ejemplo, para generar usuarios aleatorios si empleamos restful_authentication podemos hacer algo así:

require 'babel'

task :populateusers => :environment do # Crea usuarios de prueba

num_users = 100 for i in 1..num_users

# Generamos datos del usuario aleatorio
if (rand < 0.5)
  name = "#{Babel::random_female_name}"
else
  name = "#{Babel::random_male_name}"
end

surname1 = "#{Babel::random_surname}"
surname2 = "#{Babel::random_surname}"
login = "#{name}.#{surname1}.#{surname2}".downcase
email = "#{login}@midominiodeconya.com"

# Creamos el usuario
user = User.new(:name => name,
            :surname1 => surname1,
            :surname2 => surname2,
            :login => login,
            :password => 'unaclave',
            :password_confirmation => 'unaclave',
            :email => email)
if user.save
  puts "Creado usuario #{login}"

  # Activamos el usuario
  user.activate
else
  puts "No he podido crear el usuario #{login}"
end

end end

Al ejecutar esta tarea con "rake populateusers", se crearán y activarán 100 usuarios con datos aleatorios. Ten en cuenta que si generas muchos pero muchos, comenzarán a repetirse las combinaciones de nombre y apellidos y como el login debe ser único, no se podrán salvar. Puedes añadir más aleatoriedad introduciendo números en el login, como en este ejemplo.

Un par de tareas más de ejemplo, la primera crea un post para los últimos 100 usuarios, y la segunda crea 10 comentarios para los últimos 100 posts. Fíjate que en los posts usamos también tags aleatorias usando Babel... una idea para conseguir mayor aleatoriedad es usar tags de dos o tres palabras aleatorias cada una.

task :populateposts => :environment do
  # Crea posts de prueba para varios usuarios

User.find(:all, :limit => '100', :order => 'id DESC').each do |u|

u.posts.create( :title => "#{Babel::random_single}",
                :body => Babel::random_long,
                :tag_list => "#{Babel::random_single}, #{Babel::random_single}, #{Babel::random_single}".downcase
              )
puts "#{u.nombre} escribe en su blog"

end end

task :populatepostcomments => :environment do # Crea comentarios de prueba para varios posts Post.find(:all, :limit => '100', :order => 'id DESC').each do |p|

# Escogemos varios usuarios
User.find(:all, :limit => '10', :order => 'id DESC').each do |u|
  texto = coge_hasta_el_punto(Babel::random_long)
  p.post_comments.create(:body => texto, :user_id => u.id)
  puts "#{u.nombre} comenta en el blog de #{p.user.nombre}"
end

end end

Ahora... ponlo a funcionar unas cuantas veces, crea usuarios, posts y comentarios y verás cómo cambia tu percepción de la aplicación. Prueba a crear muchos contenidos, al menos el doble de lo que esperas soportar en tu aplicación, para asegurarte de que la aplicación responde como es debido... seguramente encontrarás algún cuello de botella que podrás solucionar con calma. :)

Creative Commons License photo credit: shellorz

Back to the list of posts
blog comments powered by Disqus