J'essaie d'apprendre la pile de technologies de la fiole et pour mon application, j'utilise Flack-Sqlalchemy. Tout fonctionne parfaitement, mais je me débats avec des tests d'intégration. Je ne veux pas utiliser SQLite depuis la production, j'utilise PostgreSQL et que des tonnes de simulacres seront effectivement tester ma propre implémentation et non la logique elle-même.
Ainsi, après quelques recherches, j'ai décidé de mettre en œuvre des tests qui écrivent des données dans la base de données de test et après chaque test des tests, les modifications (pour la performance des performances). En fait, j'essaie de mettre en œuvre quelque chose de similaire à cette approche: HTTP : //sontek.net/blog/detail/writing-tests-for-pyramid-and-sqlalchemy . P>
Mon problème est de créer une transaction correcte et de la récupérer. Voici le code de ma classe de base: p> Lorsque j'essaie d'exécuter des tests, j'ai reçu une erreur suivante: P> Traceback (most recent call last):
File "myapp/src/core/tests/__init__.py", line 53, in tearDown
self.trans.rollback()
File "myapp/venv/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 370, in rollback
self._assert_active(prepared_ok=True, rollback_ok=True)
File "myapp/venv/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 203, in _assert_active
raise sa_exc.ResourceClosedError(closed_msg)
ResourceClosedError: This transaction is closed
3 Réponses :
Vous êtes DeauTownClass et SetUpClass causent les problèmes.
La SETUPCLASCLAS est appelée une fois avant tous les tests, et le TeReLowdownClass est après tous les tests de la classe. p>
Donc, si vous avez 3 tests. p>
setupclass est appelé p>
La configuration est appelée p>
la déchirure est appelée (vous retournez, mais vous ne commencez pas une session, cela jette une erreur) p>
la configuration est appelée (un autre rollbule qui va à l'erreur) p>
etc ... p>
Ajouter une db.session.begin à votre démolition et tout ira bien . p>
J'ai écrit un article de blog sur la façon de la configurer ... En bref, vous devez créer une transaction imbriquée de sorte que les appels de session.commit () à l'intérieur de votre application ne cassent pas votre isolation. Appliquez ensuite un auditeur à la transaction interne pour le redémarrer à tout moment, quelqu'un essaie de l'engager ou de le rouler. Cas d'essai de transaction de flacon-sqlalchimy p>
Si la taille des données de votre base de données n'est pas très grande et que vous souhaitez conserver des données inchangées, vous pouvez faire une sauvegarde (par écrire des sentenses SQL droit) dans Configurer P> "DROP TABLE {0}".format(table_name)
"RENAME TABLE {0}_backup TO {0}".format(table_name)
Je ne sais pas comment le flacon gère toute la transaction (dans un cas normal, il va commettre / retournera à la fin d'une demande). Sur un test d'intégration, cette opération sera susceptible de se produire (commettant). Il n'y a pas vraiment une solution propre. Désactivez ce comportement ou supprimez les données manuellement.