2010-04-12 10 views
5

Con Ruby on Rails, c'è un modo per scaricare il mio database di produzione in un modulo a cui può accedere la parte di test di Rails?Ruby on Rails: accesso ai dati del database di produzione per il test

Penso che sia un modo per trasformare il database di produzione in fixture, oppure un modo per migrare i dati dal database di produzione nel database di test che non verranno sistematicamente cancellati da Rails.

Mi piacerebbe utilizzare questi dati per una serie di test, ma soprattutto nella mia mente si utilizzano dati reali con i test delle prestazioni, in modo da poter ottenere una comprensione realistica dei tempi di caricamento.

+0

Ci potrebbe essere un modo per fare questo con rubino, ma vorrei usare i comandi di database (come mysqldump) in un compito rastrello, invece. – mckeed

+0

Questa è davvero una bella domanda. Sfortunatamente, la maggior parte delle soluzioni offerte non funzionerà per me. Faccio scienza, quindi il nostro database è ENORME e sarebbe estremamente difficile campionarne alcuni per generare un database di test. Esiste un modo per eseguire i test unitari su produzione o sviluppo in modalità di sola lettura DB? –

risposta

0

È possibile utilizzare seed.rb all'interno della cartella db, compilare il database di test con i dati necessari. C'è un bell'esempio disponibile su Railscasts: http://railscasts.com/episodes?search=seed

Vi raccomanderei comunque di mantenere i vostri dati di produzione lontani dai vostri ambienti di test. E fai i backup !!!

+0

Bene, sto immaginando che la produzione => test di condivisione dei dati sarà un processo strettamente one way. Per quanto riguarda db: seed, grazie per il suggerimento, non ne avevo mai sentito parlare prima. Tuttavia, non vedo davvero un modo per usarlo per seminare il mio database di test con le informazioni dal mio database di produzione? –

2

Abbiamo appena avuto un problema simile e abbiamo finito di scrivere un metodo di supporto in rspec che recupera alcuni dati (nel nostro caso, i dettagli di accesso per alcuni account) dal database di produzione.

Il seguente dovrebbe dare un'idea:

require 'yaml' 

def accounts 
    @accounts ||= lambda { 
    config = YAML.load_file("#{Rails.root}/config/database.yml")['production'] 

    dbh = Mysql.real_connect(config['host'], config['username'], config['password'], config['database']) 

    accounts = [] 
    result = dbh.query("SELECT `accounts`.* FROM `accounts`") 
    while row = result.fetch_hash do 
     row.delete("id") 
     accounts << Account.make(row) 
    end 

    dbh.close 

    return accounts 
    }.call 
end