PostgreSQL intégré
Existe-t-il un PostgreSql intégré afin que nous puissions tester notre application pilotée par PostgreSql?
Puisque PostgreSql a quelques dialectes, il est préférable d'utiliser lui-même embedded PostgreSql que d'autres bases de données embarquées.
5 réponses
Non, il n'y a pas de PostgreSQL intégré, dans le sens d'une database-as-a-library en cours de chargement. PostgreSQL est orienté processus; chaque backend a un thread, et il génère plusieurs processus pour fonctionner. Il n'a pas de sens en tant que Bibliothèque.
La base de données H2 prend en charge un sous-ensemble limité du dialecte SQL PostgreSQL et l'utilisation du pilote PgJDBC.
Ce que vous peut n'est initdb
une nouvelle base de données temporaire, commencer avec pg_ctl
sur un port aléatoire afin qu'il ne soit pas en conflit avec d'autres instances, exécutez vos tests, puis utilisez pg_ctl
pour l'arrêter et enfin supprimer la base de données temporaire.
JErecommande fortement d'exécuter le Postgres temporairesur un port non par défaut afin de ne pas risquer de heurter un PostgreSQL installé localement sur la machine exécutant les tests.
(Y est "embedded PostgreSQL dans le sens de ecpg, essentiellement PostgreSQL client intégré dans C code source en tant qu'extensions de langage C basées sur le préprocesseur. Il nécessite toujours un serveur en cours d'exécution et c'est un peu méchant à utiliser, pas vraiment recommandé. Il existe principalement pour faciliter le portage à partir de diverses autres bases de données.)
Le est un serveur PostgresSQL" intégré " qui a été conçu pour les tests unitaires à partir de Java:
Https://github.com/yandex-qatools/postgresql-embedded
Embedded postgresql fournira un moyen neutre pour exécuter le binaire postgres dans tests unitaires . Une grande partie du code a été créée à partir du processus d'intégration de Flapdoodle OSS
Comme un de côté, il existe aussi des projets similaires pour Mongo, Redis, Memcached et nodejs.
J'ai essayé le projet suggéré par @btiernay (yandex-qatools). J'ai passé quelques bons jours avec cela et sans aucune infraction, c'est une solution trop conçue qui ne fonctionne pas dans mon cas car je voulais télécharger les binaires du référentiel interne plutôt que d'aller sur internet public. En théorie, il le supporte mais en fait ce n'est pas le cas.
OpenTable Intégré PostgreSQL Composant
J'ai fini par utiliser otj-pg-embedded et cela fonctionne comme un charme. Il a été mentionné dans les commentaires afin Je pensais que je vais le mentionner ici aussi.
Je l'ai utilisé comme base de données autonome et non par règle pour les tests unitaires et le développement local.
Dépendance:
<dependency>
<groupId>com.opentable.components</groupId>
<artifactId>otj-pg-embedded</artifactId>
<version>0.7.1</version>
</dependency>
Code:
@Bean
public DataSource dataSource(PgBinaryResolver pgBinaryResolver) throws IOException {
EmbeddedPostgres pg = EmbeddedPostgres.builder()
.setPgBinaryResolver(pgBinaryResolver)
.start();
// It doesn't not matter which databse it will be after all. We just use the default.
return pg.getPostgresDatabase();
}
@Bean
public PgBinaryResolver nexusPgBinaryResolver() {
return (system, machineHardware) -> {
String url = getArtifactUrl(postgrePackage, system + SEPARATOR + machineHardware);
log.info("Will download embedded Postgre package from: {}", url);
return new URL(url).openConnection().getInputStream();
};
}
private static String getArtifactUrl(PostgrePackage postgrePackage, String classifier) {
// Your internal repo URL logic
}
Vous pouvez utiliser un conteneur exemple de PostgreSQL.
Puisque la rotation d'un conteneur est une question de secondes, cela devrait être assez bon pour unittests.
De plus, dans le cas où vous devez conserver les données, par exemple pour une enquête, vous n'avez pas besoin d'enregistrer le conteneur entier, seulement les fichiers de données, qui peuvent être mappés en dehors du conteneur.
Un exemple de cette procédure peut être trouvé ici.
Si vous cherchez à exécuter une version en cours de processus de postgres à partir d'une suite de tests D'intégration (ou similaire), le postgresql-embedded a bien fonctionné pour moi.
J'ai écrit un petit plugin maven qui peut être utilisé comme un wrapper Maven autour d'une version fourchue de postgresql-embedded.