J'essaie de migrer mes tests unitaires de H2 vers Postgresql.
Actuellement, H2 me donne un schéma en mémoire tel que chaque connexion mappe à un schéma unique, crée les tables, exécute le test et supprime le schéma. La création et la destruction du schéma sont gérées automatiquement par H2.
Les tests unitaires s'exécutent simultanément.
Quelle est la meilleure façon de procéder à Postgresql? Plus précisément,
- Comment obtenir un schéma unique par connexion?
- Le cadre de test doit-il générer des noms uniques ou existe-t-il un mécanisme intégré pour ce faire?
- Comment puis-je m'assurer que le schéma est supprimé lorsque la connexion est interrompue?
- Je ne veux pas me retrouver avec des schémas pendants lorsque les tests unitaires sont tués.
- Quelle approche donnera les performances les plus élevées?
- J'ai besoin de créer / supprimer des dizaines de schémas par seconde.
MISE À JOUR : J'ai trouvé une réponse connexe ici, mais elle ne parvient pas à supprimer les schémas au cas où le processus exécutant les tests unitaires serait tué.
la source
pg_temp
un seul schéma est-il vrai? Ainsi, lorsque j'exécute des tests unitaires simultanés, ne s'encombrent-ils pas les tables / données les uns des autres?SET search_path
; utiliserSET LOCAL search_path
pour définir par sous-transaction, ou si vous le souhaitez, vous pouvez définir au niveau de l'utilisateur avecALTER USER mytestuser SET search_path = 'pg_temp'
, ou au niveau de la base de données avecALTER DATABASE mytestdb SET search_path = 'pg_temp'
pg_temp
schéma?Vous pouvez obtenir le nom du schéma temporaire actuel (après avoir créé la première table temporaire) comme indiqué dans le lien que vous avez ajouté:
Mais votre plan actuel n'aurait toujours pas beaucoup de sens. Pour créer des tables dans le schéma temporaire actuel, créez simplement des tables temporaires. C'est tout. Par défaut, le
search_path
est défini de sorte que les tables temporaires soient visibles en premier. Il n'est jamais nécessaire de qualifier le schéma des tables temporaires. Vous ne devriez jamais avoir à adresser directement le schéma temporaire actuel de quelque manière que ce soit - c'est un détail d'implémentation.la source
If you're explicitly sequences ...
Je pense que votre dernier commentaire contenait une faute de frappe. Que vouliez-vous dire entreexplicitly
etsequences
?Vos tests impliquent-ils des transactions? DDL est transactionnel dans PostgreSQL, donc si vous créez votre schéma et vos tables, puis exécutez vos tests, le tout dans une seule transaction qui est ensuite annulée, le schéma n'est jamais réellement validé et visible pour les autres sessions.
Vous devez toujours utiliser un nom probablement unique pour votre schéma (peut-être inclure le nom d'hôte et le PID), car
CREATE SCHEMA
il échouera immédiatement si un schéma portant le même nom existe déjà et se bloquera si une autre session a créé un schéma portant le même nom dans une transaction non validée.Une alternative serait peut-être simplement d'utiliser des tables temporaires, si vous êtes en mesure de modifier vos scripts de création de base de données pour ce faire.
la source
CREATE SCHEMA
est la seule qui puisse garantir leur disparition lorsque le test unitaire sera tué.Je viens de me faire une idée.
Postgresql garantit qu'une session ne peut pas voir les tables temporaires d'une autre. Je suppose que cela signifie que lorsque vous créez une table temporaire, cela crée un schéma temporaire. Je pourrais peut-être faire ce qui suit:
Je n'aime pas me fier aux détails de l'implémentation, mais dans ce cas, cela semble assez sûr.
la source