In C#/nHibernate-projects Sto usando SQLite per testare il mio codice, utilizzando approssimativamente il metodo descritto qui: http://ayende.com/blog/3983/nhibernate-unit-testing.Copia il database SQLite in memoria per rendere più veloci i test di unità
Tuttavia, trovo che la creazione e la configurazione del database in memoria richiede in genere circa 150 ms. Ho un sacco di test unitario quindi questo si aggiunge rapidamente.
Voglio costruire e configurare il database una volta, memorizzarlo in una variabile statica e copiarlo ogni volta che un test di unità richiede un database.
Come eseguire il backup di un database in memoria?
Prima ho provato a creare un database in memoria denominato. Secondo https://www.sqlite.org/inmemorydb.html questo è possibile. Ho usato per avere:
private const string ConnectionString = "Data Source=:memory:;Version=3;";
stringhe di connessione che ho provato sono:
private const string ConnectionString = "FullUri=file:memorydb.db?mode=memory&cache=shared";
private const string ConnectionString2 = "FullUri=file:memorydb2.db?mode=memory&cache=shared";
Così ora non mi resta che scoprire come copiare rapidamente i contenuti da uno all'altro? Sono quasi arrivato: posso creare due database in memoria e chiamare "BackupDatabase" per copiare il database.
Il test di unità, tuttavia, si comporta come se il database di "istanza" non avesse tabelle, anche il database "prototipo".
private static ISessionFactory _prototypeSessionFactory;
private const string InstanceConnectionString = "FullUri=file:memorydb.db?mode=memory&cache=shared";
private const string PrototypeConnectionString = "FullUri=file:memorydb2.db?mode=memory&cache=shared";
private SQLiteConnection _instanceConnection;
private ISessionFactory _instanceSessionFactory;
public DatabaseScope(Assembly assembly)
{
var prototyeConfiguration = SQLiteConfiguration.Standard.ConnectionString(PrototypeConnectionString);
var cfg = Fluently
.Configure()
.Database(prototyeConfiguration)
.Mappings(m => m.HbmMappings.AddFromAssembly(assembly));
cfg.ExposeConfiguration(BuildSchema);
_prototypeSessionFactory = cfg.BuildSessionFactory();
var instanceConfiguration = SQLiteConfiguration.Standard.ConnectionString(InstanceConnectionString);
_instanceSessionFactory = Fluently
.Configure()
.Database(instanceConfiguration)
.BuildSessionFactory();
CopyDatabase();
}
private void CopyDatabase()
{
var cnnIn = new SQLiteConnection(PrototypeConnectionString);
var cnnOut = new SQLiteConnection(InstanceConnectionString);
cnnIn.Open();
cnnOut.Open();
cnnIn.BackupDatabase(cnnOut, "main", "main", -1, null, -1);
cnnIn.Close();
cnnOut.Close();
}
secondo [questo articolo] (https://www.sqlite.org/backup.html) (vedi loadOrSaveDb esempio). Sembra che tu debba usare 'sqlite3_backup_init()' con un puntatore al DB di destinazione. Comunque non penso che risolverà il tuo problema. i tuoi test suonano come un test di integrazione non UT. Penso che dovresti prendere in considerazione l'uso di un framework di simulazione e sostituire il tuo DB. –
Grazie per la tua risposta, Old Fox. Hai ragione: sono in parte test di integrazione. E funzionano perfettamente, solo un po 'lento, che fa male per più di 300 test. Non vedo l'ora di riscrivere molti test, ma per amor di discussione: come procederesti a sostituire il database usando un sistema di simulazione? (Considero quello che sto facendo beffardo: sto usando SQLite per deridere il mio database, assicurandomi che tutto funzioni anche quando i miei mapping nHibernate sono corretti.) – realbart
Penso che 300+ test di integrazione che verificano la mappatura è un po ' troppo ... Credo che il tuo codice funzioni direttamente contro 'NHibernate'. Se è così, ti consiglio di dividere i test in 2 tipi: 1. comportamento + chiamare l'OEM correttamente (OEM falso probabilmente la maggior parte dei test esistenti). 2. Test di integrazione - OEM ha mappato correttamente il tipo (probabilmente il 10% rispetto ai 300+ test). Informazioni su come simulare il DB, non pensarci più, è stata colpa mia ... –