In C#/nHibernate-Projekten verwende ich SQLite, um meinen Code zu testen, ungefähr mit der hier beschriebenen Methode: http://ayende.com/blog/3983/nhibernate-unit-testing.In-Memory-SQLite-Datenbank kopieren, um Unit-Tests schneller zu machen
Ich finde jedoch, dass das Erstellen und Konfigurieren der In-Memory-Datenbank in der Regel etwa 150 ms dauert. Ich habe viele Komponententests, also addiert sich das schnell.
Ich möchte die Datenbank einmal erstellen und konfigurieren, sie in einer statischen Variablen speichern und jedes Mal kopieren, wenn ein Komponententest eine Datenbank benötigt.
Wie kann ich eine In-Memory-Datenbank sichern?
Ich habe zuerst versucht, eine benannte In-Memory-Datenbank zu erstellen. Dies ist gemäß https://www.sqlite.org/inmemorydb.html möglich. Früher habe ich haben:
private const string ConnectionString = "Data Source=:memory:;Version=3;";
Verbindungszeichenfolgen Ich habe versucht, sind:
private const string ConnectionString = "FullUri=file:memorydb.db?mode=memory&cache=shared";
private const string ConnectionString2 = "FullUri=file:memorydb2.db?mode=memory&cache=shared";
So, jetzt muss ich nur noch herausfinden, wie schnell Inhalte von einem zum anderen kopieren zu? Ich bin fast da: Ich kann zwei In-Memory-Datenbanken erstellen und "BackupDatabase" aufrufen, um die Datenbank zu kopieren.
Der Komponententest verhält sich jedoch wie die "Instanz" -Datenbank hat keine Tabellen, sogar die "Prototyp" -Datenbank.
nach [diesem Artikel] (https://www.sqlite.org/backup.html) (siehe loadOrSaveDb Beispiel). Es scheint, dass Sie 'sqlite3_backup_init()' mit einem Zeiger auf die Zieldatenbank verwenden müssen. Aber ich denke nicht, dass es dein Problem lösen wird. Ihre Tests klingen wie ein Integrationstest nicht UT. Ich denke, Sie sollten in Betracht ziehen, ein spöttisches Framework zu verwenden und Ihre DB zu ersetzen. –
Danke für deine Antwort, Old Fox. Du hast Recht: Sie sind teilweise Integrationstest. Und sie funktionieren perfekt, nur ein bisschen langsam, was für mehr als 300 Tests schmerzt. Ich freue mich nicht darauf, so viele Tests neu zu schreiben, aber um des Arguments willen: Wie würdest du die Datenbank ersetzen, indem du ein spöttisches Framework verwendest? (Ich überlege, was ich spöttisch mache: Ich benutze SQLite, um meine Datenbank zu überspielen, und stelle sicher, dass alles funktioniert, solange meine nHibernate-Mappings korrekt sind.) – realbart
Ich denke, 300+ Integrationstests bestätigen das Mapping ein wenig zu viel ... Ich glaube, dein Code arbeitet direkt gegen 'NHibernate'. Wenn ja, würde ich Ihnen raten, die Tests in 2 Arten zu teilen: 1. Verhalten + rufen Sie den OEM korrekt (gefälschte OEM. Wahrscheinlich die meisten Ihrer vorhandenen Tests). 2. Integrationstests - OEM hat den Typ korrekt zugeordnet (wahrscheinlich 10% aus den mehr als 300 Tests). Über die Fälschung der DB, vergessen Sie es, es war meine Schuld .... –