Comment utiliser SQLite: mémoire: base de données dans py web pour les tests unitaires
-
12-09-2019 - |
Question
Je veux utiliser une SQLite en mémoire ( « : mémoire: ») DB pour les tests dans mon webapp. J'utilise nosetests pour les tests et webpy comme cadre.
Je veux remplir la base de données dans la fonction setup (), puis exécutez tous mes tests. Mon problème est que webpy ferme toutes les connexions DB ouvertes après chaque demande, et SQLite: mémoire:. DB ne dure que jusqu'à la fermeture de la connexion, de sorte que le premier test est exécuté en fait correctement et que toutes les autres échouent
Mes choix sont soit pour exécuter les tests sur un disque soutenu DB, ou de recréer l'ensemble DB en mémoire au début de chaque test.
Savez-vous comment puis-je empêcher webpy de fermer les connexions DB après chaque demande? Pouvez-vous penser à une autre façon d'obtenir une mémoire SQLite DB qui dure plus d'une demande à l'aide webpy?
La solution
Peut-être que vous pouvez exécuter les tests sur un DB stockés sur le disque, mais en utilisant un . Sous Windows, vous pouvez installer un pilote pour mettre en place un disque RAM ( quelques instructions ici ). Sous Linux, je crois que vous voulez mettre en place tmpfs .
Un disque de RAM va agir exactement comme un disque dur, mais fonctionnera complètement de la mémoire, de sorte que vous perdrez une partie des frais généraux de chargement des fichiers vers / à partir du disque dur.
Autres conseils
Untested:
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
Notez que cela ne peut fonctionner que si vous exécutez web.py d'une manière qui utilise un seul processus de système d'exploitation. Si une demande est envoyée sur plusieurs processus, chacun sera toujours obtenir sa propre base de données.