6
votes

Les tests d'intégration Flack-SQLalchemy ne peuvent pas trouver un moyen de modifier les modifications

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> xxx pré>

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


1 commentaires

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.


3 Réponses :


0
votes

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.

Donc, si vous avez 3 tests.

setupclass est appelé

La configuration est appelée

la déchirure est appelée (vous retournez, mais vous ne commencez pas une session, cela jette une erreur)

la configuration est appelée (un autre rollbule qui va à l'erreur)

etc ...

Ajouter une db.session.begin à votre démolition et tout ira bien . xxx


0 commentaires

0
votes

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


0 commentaires

0
votes

une solution possible à votre question: strong>

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)


0 commentaires