So verwenden Sie SQLite: memory: Datenbank in Web-py für Unit-Tests
-
12-09-2019 - |
Frage
Ich mag eine SQLite im Speicher verwenden ( ": memory:") DB für die Tests in meinem Webapp. Ich verwende nosetests für die Tests und webpy als Rahmen.
Ich will die DB im Setup () Funktion füllen, und dann alle meine Tests ausführen. Mein Problem ist, dass webpy alle offenen DB-Verbindungen nach jeder Anfrage wird geschlossen, und die SQLite: Speicher:. DB dauert nur, bis Sie die Verbindung zu schließen, so dass nur der erste Test ausgeführt wird tatsächlich richtig und alle anderen versagen
sind meine Entscheidungen entweder die Tests auf einem Datenträger gesichert DB, laufen oder die gesamte DB im Speicher zu Beginn eines jeden einzelnen Tests neu zu erstellen.
Wissen Sie, wie kann ich webpy von Schließung DB-Verbindungen nach jeder Anforderung verhindern? Können Sie sich auf andere Weise denken eine im Speicher SQLite DB zu erhalten, die für mehr als eine Anforderung mit webpy dauert?
Lösung
Vielleicht auf der Platte gespeichert Sie können die Tests auf einer DB laufen, aber unter Verwendung eines RAM-Disk . In Windows können Sie einen Treiber installieren Sie eine RAM-Disk einrichten ( einige Anweisungen hier ). In Linux, ich glaube, Sie tmpfs einrichten möchten.
Ein RAM-Disk wirkt genau wie eine Festplatte, wird aber vollständig aus dem Gedächtnis arbeiten, so dass Sie einige des Aufwand für das Laden von Dateien zu / von der Festplatte verlieren.
Andere Tipps
Nicht getestet:
class NoCloseDB(web.db.SqliteDB):
def _unload_context(self):
pass # this keeps the _ctx.db attribute alive
web.db.register_database('sqlite',NoCloseDB) # overrides the previous registration
Beachten Sie, dass dies nur funktionieren, wenn Sie web.py in einer Art und Weise ausgeführt werden, dass nur ein Betriebssystem-Prozess verwendet. Wenn eine Anforderung über mehrere Prozesse versandt wird, wird jeder noch eine eigene Datenbank erhalten.