(Déplacer ma réponse de Utiliser PostgreSQL en mémoire et la généraliser):
Vous ne pouvez pas exécuter Pg en cours de traitement, en mémoire
Je ne peux pas comprendre comment exécuter la base de données Postgres en mémoire pour les tests. C'est possible?
Non ce n'est pas possible. PostgreSQL est implémenté en C et compilé en code de plateforme. Contrairement à H2 ou Derby, vous ne pouvez pas simplement charger le jar
et le lancer comme une base de données en mémoire jetable.
Contrairement à SQLite, qui est également écrit en C et compilé en code de plate-forme, PostgreSQL ne peut pas non plus être chargé en cours de traitement. Il nécessite plusieurs processus (un par connexion) car il s'agit d'une architecture multitraitement et non multithreading. L'exigence de multitraitement signifie que vous devez lancer le postmaster en tant que processus autonome.
Au lieu de cela: préconfigurer une connexion
Je suggère simplement d'écrire vos tests pour vous attendre à ce qu'un nom d'hôte / nom d'utilisateur / mot de passe particulier fonctionne, et que le test exploite CREATE DATABASE
une base de données jetable, puisDROP DATABASE
à la fin de la course. Obtenez les détails de connexion à la base de données à partir d'un fichier de propriétés, des propriétés de la cible de construction, d'une variable d'environnement, etc.
Vous pouvez utiliser en toute sécurité une instance PostgreSQL existante dans laquelle vous avez déjà des bases de données qui vous intéressent, tant que l'utilisateur que vous fournissez à vos tests unitaires n'est pas un super-utilisateur, seulement un utilisateur avec des CREATEDB
droits. Au pire, vous créerez des problèmes de performances dans les autres bases de données. Je préfère exécuter une installation PostgreSQL complètement isolée pour tester pour cette raison.
Au lieu de cela: lancez une instance PostgreSQL jetable à des fins de test
Alternativement, si vous êtes vraiment envie que vous pourriez avoir votre harnais de test localiser les initdb
et postgres
binaires, exécutez initdb
pour créer une base de données, modifier pg_hba.conf
à trust
, courir postgres
pour le démarrer sur un port aléatoire, créez un utilisateur, créez un DB, et exécuter les tests . Vous pouvez même regrouper les binaires PostgreSQL pour plusieurs architectures dans un fichier jar et décompresser ceux de l'architecture actuelle dans un répertoire temporaire avant d'exécuter les tests.
Personnellement, je pense que c'est une douleur majeure qui devrait être évitée; il est beaucoup plus facile de configurer simplement une base de données de test. Cependant, c'est devenu un peu plus facile avec l'avènement du include_dir
support dans postgresql.conf
; maintenant, vous pouvez simplement ajouter une ligne, puis écrire un fichier de configuration généré pour tout le reste.
Des tests plus rapides avec PostgreSQL
Pour plus d'informations sur la façon d' améliorer en toute sécurité les performances de PostgreSQL à des fins de test, consultez une réponse détaillée que j'ai écrite sur ce sujet plus tôt: Optimiser PostgreSQL pour des tests rapides
Le dialecte PostgreSQL de H2 n'est pas un véritable substitut
Certaines personnes utilisent à la place la base de données H2 en mode dialecte PostgreSQL pour exécuter des tests. Je pense que c'est presque aussi mauvais que les gens de Rails qui utilisent SQLite pour les tests et PostgreSQL pour le déploiement en production.
H2 prend en charge certaines extensions PostgreSQL et émule le dialecte PostgreSQL. Cependant, c'est juste cela - une émulation. Vous trouverez les zones où H2 accepte une requête mais PostgreSQL qui ne fonctionne pas, où diffère du comportement, etc . Vous trouverez également de nombreux endroits où PostgreSQL prend en charge ce que H2 ne peut tout simplement pas faire - comme les fonctions de fenêtre, au moment de l'écriture.
Si vous comprenez les limites de cette approche et que votre accès à la base de données est simple, H2 peut être OK. Mais dans ce cas, vous êtes probablement un meilleur candidat pour un ORM qui résume la base de données car vous n'utilisez de toute façon pas ses fonctionnalités intéressantes - et dans ce cas, vous n'avez plus à vous soucier de la compatibilité de la base de données.
Les tablespaces ne sont pas la solution!
N'utilisez pas d' espace de table pour créer une base de données «en mémoire». Non seulement cela n'est pas nécessaire car cela n'aidera pas de manière significative les performances de toute façon, mais c'est aussi un excellent moyen de perturber l'accès à tout autre élément qui pourrait vous intéresser dans la même installation PostgreSQL. La documentation 9.4 contient désormais l'avertissement suivant :
AVERTISSEMENT
Même s'ils sont situés en dehors du répertoire de données principal de PostgreSQL, les tablespaces font partie intégrante du cluster de bases de données et ne peuvent pas être traités comme une collection autonome de fichiers de données. Ils dépendent des métadonnées contenues dans le répertoire de données principal et ne peuvent donc pas être attachés à un autre cluster de bases de données ou sauvegardés individuellement. De même, si vous perdez un tablespace (suppression de fichier, panne de disque, etc.), le cluster de base de données peut devenir illisible ou ne pas pouvoir démarrer. Le fait de placer un tablespace sur un système de fichiers temporaire tel qu'un disque virtuel risque de compromettre la fiabilité de l'ensemble du cluster.
parce que j'ai remarqué que trop de gens faisaient cela et avaient des problèmes.
(Si vous avez fait cela, vous pouvez mkdir
le répertoire de tablespace manquant pour redémarrer PostgreSQL, puis DROP
les bases de données manquantes, les tables, etc. Il vaut mieux ne pas le faire.)